[英]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.