无法在C中正确打印长双

时间:2014-10-10 09:24:04

标签: c 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 

1 个答案:

答案 0 :(得分:7)

Windows下的MinGW存在类似的问题。如果那不是你正在使用的,那么这个答案可能并不适用。

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

表示的选择是完全合法的,但它们彼此不相容。它不是GCC或Microsoft库中的错误,而是MinGW集成它们的方式。

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

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