我正在尝试打印一个简单的长双精度,但它不起作用
我尝试过的:
long double ld=5.32;
printf("ld with le = %Le \n",ld);
printf("ld with lf = %Lf \n",ld);
printf("ld with lg = %Lg \n",ld);
输出:
ld with le = -3.209071e-105
ld with lf = -0.000000
ld with lg = -3.20907e-105
有了新的价值:
ld=6.72;
输出:
ld with le = -1.972024e+111
ld with lf = -1972024235903379200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
ld with lg = -1.97202e+111
Windows下的MinGW也有类似的问题。如果这不是您使用的,则此答案可能不适用。
问题在于,编译器(GCC)和运行时库(Microsoft 的)是由不同的小组实现的,这些小组对于如何表示类型
long double
恰好有不同的想法。 (gcc 使用 128 位表示 long double
;Microsoft 使用 64 位,与 double
具有相同的表示形式。)
这两种表示方式的选择都是完全合法的,但它们彼此不兼容。这不是 GCC 或 Microsoft 库中的错误,而是 MinGW 集成它们的方式的错误。
您的选择是使用 MinGW 以外的实现,编写或复制正确处理
long double
的代码,或者避免调用任何接受参数或返回 long double
类型结果的库函数(对 long double
的计算应该'只要它们不调用任何库函数就不会成为问题)。例如,您可以转换为 double
并使用 %g
进行打印,但范围和精度会有所损失。
另一个(可能更好)的解决方法是使用
-D__USE_MINGW_ANSI_STDIO
进行编译,这会导致 MinGW 使用自己的 printf
及其朋友的实现,而不是依赖于 Microsoft 实现。