By raldi


2008-10-16 23:05:15 8 Comments

Why is it that scanf() needs the l in "%lf" when reading a double, when printf() can use "%f" regardless of whether its argument is a double or a float?

Example code:

double d;
scanf("%lf", &d);
printf("%f", d);

5 comments

@MSN 2008-10-16 23:06:56

Because C will promote floats to doubles for functions that take variable arguments. Pointers aren't promoted to anything, so you should be using %lf, %lg or %le (or %la in C99) to read in doubles.

@AnT 2015-01-29 18:58:50

Since С99 the matching between format specifiers and floating-point argument types in C is consistent between printf and scanf. It is

  • %f for float
  • %lf for double
  • %Lf for long double

It just so happens that when arguments of type float are passed as variadic parameters, such arguments are implicitly converted to type double. This is the reason why in printf format specifiers %f and %lf are equivalent and interchangeable. In printf you can "cross-use" %lf with float or %f with double.

But there's no reason to actually do it in practice. Don't use %f to printf arguments of type double. It is a widespread habit born back in C89/90 times, but it is a bad habit. Use %lf in printf for double and keep %f reserved for float arguments.

@M.M 2016-05-22 04:39:12

I would say that using %f in printf is a good habit because then your code always works, whereas using %lf may fail if the compiler does not have a C99 compliant library. Unfortunately that situation does happen in reality.

@Andrew Henle 2018-07-14 18:02:29

Since С99 the matching between format specifiers and floating-point argument types in C is consistent between printf and scanf. Note that this does not imply that using the same format specifier means that the data written by a [f]printf() can be read by [f]scanf(). In general, using the same format specifier for scanf() that was used by printf() will not successfully read the data. For example, space padding that can be inserted by a prinf()'s "%d" format specifier will be skipped by that same "%d" format specifier in a scanf() call.

@Tanktalus 2008-10-16 23:09:12

scanf needs to know the size of the data being pointed at by &d to fill it properly, whereas variadic functions promote floats to doubles (not entirely sure why), so printf is always getting a double.

@mwfearnley 2016-11-05 12:54:49

A variadic function is very fragile, because it needs to be able to know the exact type and size of all the parameters passed to it, and it can't enforce this at compile time. If a variable is the wrong type, the wrong value will be read; if it's the wrong size, all the variables after will be misread too. If two different sizes of float could be passed, then it would cause all kinds of nasty and easy-to-miss problems.

@Jim Buck 2008-10-16 23:10:28

Because otherwise scanf will think you are passing a pointer to a float which is a smaller size than a double, and it will return an incorrect value.

@fcw 2008-10-16 23:09:59

Using either a float or a double value in a C expression will result in a value that is a double anyway, so printf can't tell the difference. Whereas a pointer to a double has to be explicitly signalled to scanf as distinct from a pointer to float, because what the pointer points to is what matters.

@Robert Gamble 2008-10-16 23:19:34

float is converted to a double in this case because the arguments are part of a variable-length argument list, floats are not always converted to doubles in C.

@AnT 2015-01-29 19:00:40

In pre-standard versions of C language float values were automatically promoted to double in expressions. That rule was abandoned in standard C. Generally, float does not get promoted to double in expressions. It only gets promoted to double when passed as a variadic argument, which is what happens in this case.

Related Questions

Sponsored Content

17 Answered Questions

[SOLVED] Why use double indirection? or Why use pointers to pointers?

  • 2011-04-07 12:08:56
  • manju
  • 205216 View
  • 254 Score
  • 17 Answer
  • Tags:   c pointers

5 Answered Questions

[SOLVED] Correct format specifier for double in printf

10 Answered Questions

[SOLVED] Improve INSERT-per-second performance of SQLite?

10 Answered Questions

[SOLVED] Why does printf not flush after the call unless a newline is in the format string?

  • 2009-11-11 16:22:39
  • Crazy Chenz
  • 333238 View
  • 516 Score
  • 10 Answer
  • Tags:   c printf flush

1 Answered Questions

[SOLVED] Scanf and printf functions in assembly, example on char* and double

  • 2019-06-10 21:30:31
  • delvian
  • 121 View
  • 0 Score
  • 1 Answer
  • Tags:   c assembly x86 att

11 Answered Questions

[SOLVED] What is the difference between float and double?

10 Answered Questions

1 Answered Questions

[SOLVED] ASM x64 scanf printf double, GAS

5 Answered Questions

[SOLVED] Why does the C preprocessor interpret the word "linux" as the constant "1"?

5 Answered Questions

[SOLVED] Reading in double values with scanf in c

Sponsored Content