繁体   English   中英

无法在 C 中正确打印 long double

[英]can't print correctly a long double in 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 

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

问题是编译器 (GCC) 和运行时库 (Microsoft 的) 是由不同的团队实现的,他们碰巧对如何表示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 的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM