无法在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实现。