大浮点和的精度

时间:2018-03-03 23:22:17

标签: c floating-point precision numerical-methods

我正在尝试对正向递减浮点的排序数组求和。我已经看到,总结它们的最佳方法是开始将数字从最低到最高加起来。我写这个代码的例子是,但是,从最高数字开始的总和更精确。为什么? (当然,总和1 / k ^ 2应为f = 1.644934066848226)。

#include <stdio.h>
#include <math.h>

int main() {

    double sum = 0;
    int n;
    int e = 0;
    double r = 0;
    double f = 1.644934066848226;
    double x, y, c, b;
    double sum2 = 0;

    printf("introduce n\n");
    scanf("%d", &n);

    double terms[n];

    y = 1;

    while (e < n) {
        x = 1 / ((y) * (y));
        terms[e] = x;
        sum = sum + x;
        y++;
        e++;
    }

    y = y - 1;
    e = e - 1;

    while (e != -1) {
        b = 1 / ((y) * (y));
        sum2 = sum2 + b;
        e--;
        y--;
    }
    printf("sum from biggest to smallest is %.16f\n", sum);
    printf("and its error %.16f\n", f - sum);
    printf("sum from smallest to biggest is %.16f\n", sum2);
    printf("and its error %.16f\n", f - sum2);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

当您添加两个具有不同数量级的浮点数时,最小数字的低位数将丢失。

当您从最小值到最大值求和时,部分总和增长Σ1/k² kN增加到n,即大约1/n-1/N(蓝色) ),与1/n²进行比较。

当您从最大值到最小值求和时,部分总和增长Σ1/k² kn增加到N,大约为π²/6-1/n(在绿色)与1/n²进行比较。

很明显,第二种情况导致更多的比特损失。

enter image description here