Conversion specifier of long double in C
c, mingw
Solution
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 to `gcc -D__USE_MINGW_ANSI_STDIO=1`
Problem
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).