On 12/28/2015 08:39 AM, Mathieu Malaterre wrote:
> On Sat, Dec 26, 2015 at 4:54 PM, Michael Kerrisk (man-pages)
> <mtk.manpa...@gmail.com> wrote:
>> (Upstream mainatiner here.)
>>
>> On 09/21/2015 03:08 PM, Mathieu Malaterre wrote:
>>> Package: manpages-dev
>>> Version: 3.65-1
>>> Severity: wishlist
>>>
>>> Currenly the man page for *printf family is difficult to read with
>>> regards to float, double and long double printing. The man page for
>>> *scanf family is much clearer. AFAIK there is a confusion with an old
>>> C89 behavior, since C99 the actual way to print a double is "lf" and
>>> "llf" for long double.
>>>
>>> Right now it reads as:
>>>
>>>       l      (ell) A following integer conversion corresponds to a
>>> long int or unsigned long int argument, or a following n conversion
>>> corresponds to a pointer to a long int argument,  or  a  following  c
>>>               conversion corresponds to a wint_t argument, or a
>>> following s conversion corresponds to a pointer to wchar_t argument.
>>>
>>> Accordingly 'll' and 'L' may need to be updated.
>>
>> So, I looked at this report, and I can't understand what the problem
>> is that is being reported. What precisely do you think needs fixing?
> 
> It should be clear from the documentation that one should use "lf" to
> print/scan to/from a double.
> 
> I'll copy/paste a better written comment from SO
> 
> [...]
> 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
> 
> However, when arguments of type float are passed to variadic functions
> (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"
> %lfwith 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 printffor double and
> keep %f reserved for float arguments.
> 
> 
> http://stackoverflow.com/a/28222471/136285
> [...]

I'm still puzzled. In the spec for fprintf(), I see:

       l (ell) Specifies that a following d, i, o, u, x, or X conversion
               specifier  applies  to  a long or unsigned long argument;
               that a following n  conversion  specifier  applies  to  a
               pointer to a long argument; that a following c conversion
               specifier applies to a wint_t argument; that a  following
               s  conversion specifier applies to a pointer to a wchar_t
               argument; or has no effect on a following a, A, e, E,  f,
               F, g, or G conversion specifier.

In other words, the standard is explicit that %lf is the same as %f.
What am I missing?

Thanks,

Michael
> 


-- 
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/

Reply via email to