C++加倍:除以100会导致非常小的错误

Joh*_*ant 0 c++ floating-point

我在此代码段中遇到了一组特定值的问题.

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;
}
Run Code Online (Sandbox Code Playgroud)

我期望最终值为result0.如果我把除法除以100则是.但是当我在添加它之前将每个值除以100时result,我最终会得到-6.8212102632969618e-013.

关于浮点运算,我有很多不明白的地方.我知道它不能保证完全精确.但是这个数据集似乎没有任何异常 - 没有非常大或非常小的值 - 所以我很惊讶计算出错了.

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

任何建议将不胜感激.

Car*_*rum 5

我不能很容易地将数字作为整数添加并稍后进行划分.

为什么不?这听起来就像是你问题的解决方案.添加整数并分割一次可能比添加浮点数和分割得快得多.

你只是在每次除以100时累积误差(因为100不是2的幂).你的所有数字都可以在a中完全表示double,但当你划分它们时,它们不是 - 因此你的错误.除了修改算法之外,你无法做任何事情.

在您的情况下,由于您除以100,您可以将最终总和四舍五入到最接近的100,并获得正确的结果.