无法在 C 中正确打印长双精度数

问题描述 投票:0回答:1

我正在尝试打印一个简单的长双精度,但它不起作用

我尝试过的:

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 
c mingw long-double
1个回答
13
投票

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

问题在于,编译器(GCC)和运行时库(Microsoft 的)是由不同的小组实现的,这些小组对于如何表示类型

long double
恰好有不同的想法。 (gcc 使用 128 位表示
long double
;Microsoft 使用 64 位,与
double
具有相同的表示形式。)

这两种表示方式的选择都是完全合法的,但它们彼此不兼容。这不是 GCC 或 Microsoft 库中的错误,而是 MinGW 集成它们的方式的错误。

您的选择是使用 MinGW 以外的实现,编写或复制正确处理

long double
的代码,或者避免调用任何接受参数或返回
long double
类型结果的库函数(对
long double
的计算应该'只要它们不调用任何库函数就不会成为问题)。例如,您可以转换为
double
并使用
%g
进行打印,但范围和精度会有所损失。

另一个(可能更好)的解决方法是使用

-D__USE_MINGW_ANSI_STDIO
进行编译,这会导致 MinGW 使用自己的
printf
及其朋友的实现,而不是依赖于 Microsoft 实现。

© www.soinside.com 2019 - 2024. All rights reserved.