无法在C中正确打印长双
我正在尝试打印一个简单的长双,但它不起作用
我尝试了什么:
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或微软库中的错误,而是MinGW集成它们的方式。
您可以选择使用MinGW以外的实现来编写或复制正确处理long double
代码,或者避免调用任何带参数的库函数或返回long double
类型的结果( long double
计算应该不是问题只要他们不调用任何库函数)。 例如,您可以转换为double
并使用%g
打印,但会丢失一些范围和精度。
另一个(可能更好的)解决方法是使用-D__USE_MINGW_ANSI_STDIO
进行编译,这会导致MinGW使用自己的printf
和朋友实现,而不是依赖于Microsoft实现。