gpt4 book ai didi

c++ - 小数点错误

转载 作者:行者123 更新时间:2023-11-27 23:01:45 25 4
gpt4 key购买 nike

为了获得更好的小数精度,我决定在我的 C++ 代码中使用“long double”。但即使是下面的代码:

long double a=5;
long double b=0.54645;
long double c=a*b;
printf("%Lf\n", c);

在我的电脑上生成 -0.00000。正如答案所指出的,我认为这是编译器的错。

动机是:我正在处理很多 double ,将它们相乘,然后将结果相加。添加时,我需要让最终答案与正确答案相差小于 1e-6。但是由于精度问题,使用 double 可能会给我一个错误的答案。通过错误的答案,我的意思是超过 1e-6 关闭。所以,我决定使用长 double 。

但另一个事实引起了我的注意,那就是:当我使用 long double 并在在线 IDE(ideone.com) 上运行我的程序时,它仍然像 double 一样四舍五入,并给我不太精确的答案。应该怎么做才能避免这种情况?

最佳答案

您的程序在我的系统上运行正常(在我删除无关紧要的内容之后);输出是:

5.000000
0.546450
2.732250

如果我更改 %Lf格式为 %f (这是不正确的),我得到 0.00000 .

我认为您使用的是 MinGW,它是 Windows 的 C 实现,它使用 gcc 编译器和 Microsoft 的运行时库。 (如果您使用 MinGW,则此答案的其余部分不正确。)

MinGW 有一个已知错误:它不处理 long double始终如一。 gcc 对待 long doubledouble 范围更广、精度更高的类型;如果我没记错的话,Microsoft 的运行时库将其视为与 double 具有相同大小、范围和精度的类型。 .

任何一种表示都是完全有效的,但是将两者结合在一个实现中会产生这种错误。这不是 gcc 或 Microsoft 实现中的错误;这是 MinGW 组合它们的方式中的错误。

您可以使用 long double 执行计算并获得一致的结果,只要您不调用任何库函数。但是如果你尝试打印 long double使用微软的 printf你会得到不一致的结果。

大概同样的问题适用于 <math.h> 中的函数.

如果您使用的是 MinGW,最好避免使用 long double , 并满足于 double 的较小范围和精度(这与您在纯 Microsoft 实现中使用 long double 获得的范围和精度相同)。


顺便说一句,您的自包含程序比它需要的要大得多;其中绝大多数与您要问的问题完全无关。和 freopen调用阻止输出出现。您有意见:

//Remember to remove freopen

但是你把电话留在原地。

这是一个较小的版本:

#include <cstdio>
int main()
{
long double a=5;
long double b=0.54645;
long double c=a*b;
printf("%Lf\n", a);
printf("%Lf\n", b);
printf("%Lf\n", c);
return 0;
}

关于c++ - 小数点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26847970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com