大きな浮動小数点の合計の精度

コーディングナイト

正に減少する浮動小数点のソートされた配列を合計しようとしています。それらを合計する最良の方法は、低いものから高いものへと数値を合計し始めることであることがわかりました。その例を示すためにこのコードを作成しましたが、最大数から始まる合計の方が正確です。どうして?(もちろん、合計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;
}
r3mainer

コードはdouble terms[n];スタック上に配列作成します。これにより、プログラムがクラッシュする前に実行できる反復回数に厳しい制限が課せられます。

ただし、この配列からは何もフェッチしないため、そこに配置する理由はまったくありません。私はあなたのコードを削除するために変更しましたterms[]

#include <stdio.h>

int main() {

    double pi2over6 = 1.644934066848226;
    double sum = 0.0, sum2 = 0.0;
    double y;
    int i, n;

    printf("Enter number of iterations:\n");
    scanf("%d", &n);

    y = 1.0;

    for (i = 0; i < n; i++) {
        sum += 1.0 / (y * y);
        y += 1.0;
    }

    for (i = 0; i < n; i++) {
        y -= 1.0;
        sum2 += 1.0 / (y * y);
    }
    printf("sum from biggest to smallest is %.16f\n", sum);
    printf("and its error %.16f\n", pi2over6 - sum);
    printf("sum from smallest to biggest is %.16f\n", sum2);
    printf("and its error %.16f\n", pi2over6 - sum2);
    return 0;

}

これを、たとえば10億回の反復で実行すると、最小優先アプローチの方がはるかに正確になります。

Enter number of iterations:
1000000000
sum from biggest to smallest is 1.6449340578345750
and its error 0.0000000090136509
sum from smallest to biggest is 1.6449340658482263
and its error 0.0000000009999996

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

大きな浮動小数点数のPython合計

分類Dev

小数点以下の整数精度のないPython浮動小数点精度

分類Dev

JavaScriptでの大きな数と浮動小数点数

分類Dev

Java / C#での浮動小数点計算の大幅な精度の違い

分類Dev

TensorFlowの浮動小数点の精度

分類Dev

Pythonの倍精度浮動小数点値?

分類Dev

Javaの半精度浮動小数点

分類Dev

浮動小数点精度のgolang

分類Dev

Java浮動小数点精度の問題

分類Dev

Java浮動小数点精度の問題

分類Dev

Javaの倍精度浮動小数点数

分類Dev

Swiftの高精度浮動小数点数

分類Dev

Xの浮動小数点精度

分類Dev

浮動小数点の精度-C ++ 03

分類Dev

浮動小数点数の精度

分類Dev

Java浮動小数点の表示精度

分類Dev

浮動小数点精度の倍精度と浮動小数点の違い

分類Dev

リテラルと計算の浮動小数点精度

分類Dev

リテラルと計算の浮動小数点精度

分類Dev

浮動小数点精度の計算(K&R 2-1)

分類Dev

C ++での浮動小数点数の完全な精度の表示?

分類Dev

浮動小数点の任意精度は利用できますか?

分類Dev

異なる言語での浮動小数点精度

分類Dev

Spring XMLでの整数、倍精度浮動小数点数、浮動小数点数、文字列などの宣言

分類Dev

浮動小数点の精度を失うことなく、浮動小数点を整数に保存します

分類Dev

符号なし数値と符号付き数値のnumpy合計が浮動小数点になります

分類Dev

Cの浮動小数点の比較よりも大きい

分類Dev

Javaで倍精度浮動小数点数よりも浮動小数点数を使用する方が良い状況はどのような場合ですか?

分類Dev

浮動小数点演算:エラーの合計と乗算

Related 関連記事

  1. 1

    大きな浮動小数点数のPython合計

  2. 2

    小数点以下の整数精度のないPython浮動小数点精度

  3. 3

    JavaScriptでの大きな数と浮動小数点数

  4. 4

    Java / C#での浮動小数点計算の大幅な精度の違い

  5. 5

    TensorFlowの浮動小数点の精度

  6. 6

    Pythonの倍精度浮動小数点値?

  7. 7

    Javaの半精度浮動小数点

  8. 8

    浮動小数点精度のgolang

  9. 9

    Java浮動小数点精度の問題

  10. 10

    Java浮動小数点精度の問題

  11. 11

    Javaの倍精度浮動小数点数

  12. 12

    Swiftの高精度浮動小数点数

  13. 13

    Xの浮動小数点精度

  14. 14

    浮動小数点の精度-C ++ 03

  15. 15

    浮動小数点数の精度

  16. 16

    Java浮動小数点の表示精度

  17. 17

    浮動小数点精度の倍精度と浮動小数点の違い

  18. 18

    リテラルと計算の浮動小数点精度

  19. 19

    リテラルと計算の浮動小数点精度

  20. 20

    浮動小数点精度の計算(K&R 2-1)

  21. 21

    C ++での浮動小数点数の完全な精度の表示?

  22. 22

    浮動小数点の任意精度は利用できますか?

  23. 23

    異なる言語での浮動小数点精度

  24. 24

    Spring XMLでの整数、倍精度浮動小数点数、浮動小数点数、文字列などの宣言

  25. 25

    浮動小数点の精度を失うことなく、浮動小数点を整数に保存します

  26. 26

    符号なし数値と符号付き数値のnumpy合計が浮動小数点になります

  27. 27

    Cの浮動小数点の比較よりも大きい

  28. 28

    Javaで倍精度浮動小数点数よりも浮動小数点数を使用する方が良い状況はどのような場合ですか?

  29. 29

    浮動小数点演算:エラーの合計と乗算

ホットタグ

アーカイブ