我正在尝试打印一个简单的长双,但它不起作用
我尝试了什么:
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
答案 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实现。