gpt4 book ai didi

C++ 加倍 : dividing by 100 causes very small error

转载 作者:太空宇宙 更新时间:2023-11-04 14:58:22 29 4
gpt4 key购买 nike

我对这段代码中的特定值集有疑问。

double inputs[] = {0, -546543, 99015, 6750, 825, 2725, 70475, 
50950, 42200, 6750, 26925, 16125, 134350, 10075, 79378};
double result = 0;
for (int i = 0; i < 15; i++) {
result += inputs[i]/100;
}

我预计 result 的最终值为 0。如果我除以 100,它就是 0。但是,当我在将每个值添加到 result 之前将其除以 100 时,我最终得到的是 -6.8212102632969618e-013。

关于浮点运算,我有很多不明白的地方。我知道不能保证完全准确。但是这个数据集似乎没有任何异常——没有很大或很小的值——所以我很惊讶计算结果是错误的。

任何人都可以向我解释一下,并就如何避免这个问题提供任何建议吗?我提供的代码已简化;在实际代码中,我不能不除以 100,也不能很容易地将数字作为整数相加,然后再除以它们。

如有任何建议,我们将不胜感激。

最佳答案

I can't very easily add the numbers as integers and divide them later.

为什么不呢?这听起来正是您问题的解决方案。将整数相加并除一次可能比将 float 相加并相除这么多快得多。

每次除以 100(因为 100 不是 2 的幂),您只是在累积误差。您的所有数字都可以在 double 中精确表示,但是当您将它们分开时,它们不是 - 因此您的错误。除了修改算法之外,您实际上无能为力。

在您的情况下,由于您要除以 100,因此您可以将最终总和四舍五入到最接近的第 100 位,并得到正确的结果。

关于C++ 加倍 : dividing by 100 causes very small error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3461347/

29 4 0