5

我正在尝试打印一个简单的 long double,但它不起作用

我尝试了什么:

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 
4

1 回答 1

10

Windows下的MinGW也有类似的问题。如果这不是您使用的,则此答案可能不适用。

问题是编译器(GCC)和运行时库(微软的)是由不同的组实现的,这些组碰巧对long double应该如何表示类型有不同的想法。(gcc 使用 128 位long double;Microsoft 使用 64 位,与 . 具有相同的表示double。)

任何一种代表选择都是完全合法的,但它们彼此不兼容。这不是 GCC 或 Microsoft 库中的错误,而是 MinGW 集成它们的方式。

您的选择是使用 MinGW 以外的实现,编写或复制long double正确处理的代码,或避免调用任何接受参数或返回类型结果的库函数long double(只要不调用,计算long double就不应该成为问题) t 调用任何库函数)。例如,您可以转换为double并使用 打印%g,但会损失一些范围和精度。

另一个(可能更好的)解决方法是使用 编译-D__USE_MINGW_ANSI_STDIO,这导致 MinGW 使用自己的实现printf和朋友,而不是依赖于 Microsoft 实现。

于 2014-10-10T20:18:22.017 回答