C中long double的转换说明符

wha*_*cko 4 c mingw

长双数据类型可以在C这些转换说明:%乐,%LE,%LF,%了Lg,%LG(参考).

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

#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; 
}
Run Code Online (Sandbox Code Playgroud)

输出:

-0

-4E-153

-0

-4E-153

-4E-153

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

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

Gon*_*alo 11

来自一个古老的mingw维基:

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

printf("value = %g\n", (double) my_long_double_value);
Run Code Online (Sandbox Code Playgroud)

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

printf("value = %I64d\n", my_long_long_value);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 谢谢,那就是mingw的错! (2认同)
  • 有一种解决方法:在源文件中使用“ #define __USE_MINGW_ANSI_STDIO 1”或将命令行更改为“ gcc -D__USE_MINGW_ANSI_STDIO = 1”。 (2认同)