C中long double的转换说明符

long double数据类型可以在C中包含这些转换说明符:%Le,%LE,%Lf,%Lg,%LG( 引用 )。

我写了一个小程序来测试:

#include  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; } 

输出:

-0

-4E-153

-0

-4E-153

-4E-153

但没有人能提供所需的输出,即656547(你可能很容易理解)。 是什么原因?

使用的编译器是gcc版本3.4.2(mingw-special)。

来自一个古老的mingw维基 :

mingw使用Microsoft C运行时库,它们的printf实现不支持’long double’类型。 作为解决方法,你可以强制转换为’double’并将其传递给printf。 例如:

 printf("value = %g\n", (double) my_long_double_value); 

请注意,“long long”类型存在类似的问题。 使用’I64’(眼睛六十四)长度修改器而不是gcc的’ll’(椭圆)。 例如:

 printf("value = %I64d\n", my_long_long_value); 

编辑(6年后):另请参阅以下Keith Thompson的评论以获得解决方法:

源文件中的#define __USE_MINGW_ANSI_STDIO 1或将命令行更改为gcc -D__USE_MINGW_ANSI_STDIO=1

MinGW C库由MSVCRT.DLL提供,它随Windows一起提供,实际上是旧的VC ++ 6.0库。

但是,MinGW使用GNU C ++库,虽然它依赖于底层的C库,但它确实支持使用iostreams输出的long double。 即使您不希望一般使用C ++,也可能值得使用足以支持此function。