The long double data type can have these conversion specifiers in C: %Le,%LE,%Lf,%Lg,%LG (reference).
I wrote a small program to test :
#include <stdio.h>
int main(void) {
long double d = 656546.67894L;
printf("%.0Le\n",d);
printf("%.0LE\n",d);
printf("%.0Lf\n",d);
printf("%.0Lg\n",d);
printf("%.0LG\n",d);
return 0;
}
Output:
-0
-4E-153
-0
-4e-153
-4E-153
But none is giving the desired output, which is 656547 (as you may easily understand). What is the reason?
The compiler used is gcc version 3.4.2 (mingw-special).
From an old mingw wiki:
mingw uses the Microsoft C run-time libraries and their implementation of printf does not support the 'long double' type. As a work-around, you could cast to 'double' and pass that to printf instead. For example:
printf("value = %g\n", (double) my_long_double_value);
Note that a similar problem exists for 'long long' type. Use the 'I64' (eye sixty-four) length modifier instead of gcc's 'll' (ell ell). For example:
printf("value = %I64d\n", my_long_long_value);
Edit (6 years later): Also see the comment below from Keith Thompson for a workaround:
#define __USE_MINGW_ANSI_STDIO 1
in the source file or change the command line togcc -D__USE_MINGW_ANSI_STDIO=1
The MinGW C library is provided by MSVCRT.DLL, which is shipped with Windows and is in fact the old VC++ 6.0 library.
MinGW does however use the GNU C++ library, and although that relies on the underlying C library, it does support long double for output using iostreams. Even if you do not wish to use C++ generally, it may be worth using just enough to support this capability.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With