gpt4 book ai didi

c++ - 通过 0.0 时减去 float 时出错

转载 作者:搜寻专家 更新时间:2023-10-31 00:03:35 25 4
gpt4 key购买 nike

以下程序:

#include <stdio.h>

int main()
{
double val = 1.0;
int i;

for (i = 0; i < 10; i++)
{
val -= 0.2;
printf("%g %s\n", val, (val == 0.0 ? "zero" : "non-zero"));
}

return 0;
}

产生这个输出:

0.8 non-zero
0.6 non-zero
0.4 non-zero
0.2 non-zero
5.55112e-17 non-zero
-0.2 non-zero
-0.4 non-zero
-0.6 non-zero
-0.8 non-zero
-1 non-zero

谁能告诉我从 0.2 减去 0.2 时出现错误的原因是什么?这是舍入错误还是其他?最重要的是,如何避免此错误?

编辑:看起来结论是不用担心,因为 5.55112e-17 非常接近于零(感谢 @therefromhere 提供的信息)。

最佳答案

这是因为 float 不能以精确值存储在内存中。所以在浮点值中使用 == 是不安全的。使用 double 会提高精度,但同样不准确。比较浮点值的正确方法是这样做:

val == target;   // not safe// instead do this// where EPS is some suitable low value like 1e-7fabs(val - target) < EPS; 

编辑:正如评论中所指出的,问题的主要原因是无法准确存储 0.2。所以当你从某个值中减去它时,每次都会导致一些错误。如果你反复进行这种浮点计算,那么在某个时候错误会很明显。我想说的是,所有的浮点值都无法存储,因为它们有无穷多个。轻微的错误值通常不会引起注意,但使用连续计算会导致更高的累积误差。

关于c++ - 通过 0.0 时减去 float 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5742032/

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