c++ - 使用 float 的系列总和

标签 c++ floating-point series

我计算了系列的前 20 个元素 -

enter image description here

有两种方式,第一种 - 向前,第二种 - 向后。为此我做了 -

#include <iostream>
#include <math.h>
using namespace std;

float sumSeriesForward(int elementCount) {
    float sum = 0;
    for (int i = 0; i < elementCount; ++i) {
        sum += (float) 1 / (pow(3, i));
    }
    return sum;
}

float sumSeriesBack(int elementCount) {
    float sum = 0;
    for (int i = (elementCount - 1); i >= 0; --i) {
        sum += (float) 1 / (pow(3, i));
    }
    return sum;
}

int main() {
    cout.precision(30);
    cout << "sum 20 first elements - forward: " << sumSeriesForward(20) << endl;
    cout << "sum 20 first elements - back: " << sumSeriesBack(20) << endl;
}

然后我得到了-

sum 20 first elements - forward: 1.5000001192092896
sum 20 first elements - back: 1.5

有人可以解释为什么这两种方式有区别吗?

最佳答案

一般来说, float 不能精确表示值。当您对值进行操作时,错误会传播。在您的示例中,当向后计算时,您将小值添加到更大的数字中,到目前为止小数字的总和很有可能对更大的数字产生影响。另一方面,当你向前计算时,你从大数字开始,较小的数字对它的影响越来越小。也就是说,在求和时,您总是希望从最小到最大求和。

只需考虑将总和保持在固定位数即可。例如,保留 4 位数字并将这些数字从上到下和从下到上相加:

values   top to bottom   bottom to top
10.00      10.00            10.01
0.004      10.00            0.010
0.003      10.00            0.006
0.002      10.00            0.003
0.001      10.00            0.001

float 的工作方式相同,使用固定数量的 [二进制] 数字。

关于c++ - 使用 float 的系列总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12272977/

相关文章:

c++使用boost/math进行连续分数评估

c++ - 每次重新编译后exe校验和不同

javascript - JS中整数除法的精确性

python - 需要将圆周率计算到30位,但在第15位之后全部失败

python - 如何将日期时间格式转换为分钟 - pandas

c++子线程在main()父线程退出时终止?

C++:字符(下一个字符);它有什么作用

c# - 如果范围更短,为什么 decimal 比 double 更精确? C#

floating-point - float 限制

python - 使用 Pandas 正则表达式基于逗号字符分隔列数据