1

重複の可能性:
多数の浮動小数点数を合計する方法は?

10,000要素×10,000要素の行列「x」があります。

最初のケースでは、次のようにマトリックスを宣言します。

int n = 10000;
unsigned int size_M = n*n;
unsigned int mem_size_M = sizeof(int)*size_M;
int* x = (int*)malloc(mem_size_M);

ステップ(1)行列が初期化されます:

for(i=0;i<n;i++)
    for(j=0;j<n;j++)
        x[i*n+j] = 1;

ステップ(2)行列の要素を合計し、合計を出力します。

for(i=0i<n;i++)
    for(j=0j<n;j++)          
        sum +=x[i*n+j];

printf("sum: %d \n", sum);

私が期待するように、上記のコードは'sum:100000000'を出力します。

ただし、次のようにマトリックスを宣言すると、次のようになります。

int n = 10000;
float size_M = n * n;
float mem_size_M = sizeof(float) * size_M;
float* x = (float*)malloc(mem_size_M);

また、手順1と2を再度実行すると、正解は出力されませんが、代わりに「16777216」が出力されます。どうしてこれなの?

答え:適切な答えを得るには、型変換を行ってください...

sum +=(int)x[i*n+j];
4

1 に答える 1

2

これは、float 型の精度制限が原因で発生します。値 > 16777216 (2^24) の float に 1.0 を追加するだけではなく、2.0 または 0.1 を追加できます。

#include <stdio.h>

int main(void)
{
    float f = 16777220;
    printf("f = %f\n", f + 1);
    printf("f = %f\n", f + 2);
    printf("f = %f\n", f + 0.1);
    return 0;
}

IEEE-754標準の浮動小数点数には、符号ビット、8 ビットの超過 127 バイナリ指数、および23 ビットの仮数で構成される 4 バイトがあります。なぜそうなったのかを正確に説明するのは少し複雑ですが、これは操作エラーが最大になる極端なケースと言えます。

于 2012-11-24T08:21:58.000 に答える