3

C++ では、次のコードを使用して、float と double の精度が限られているため、エラーの大きさの順序を計算します。

 float n=1;
 float dec  = 1;

 while(n!=(n-dec)) {
    dec = dec/10;
 }
 cout << dec << endl;

(ダブルの場合、行 1 と 2 でフロートをダブルと交換するだけです)

Unix システムで g++ を使用してこれをコンパイルして実行すると、結果は次のようになります。

Float  10^-8
Double 10^-17

ただし、Windows 7 で MinGW を使用してコンパイルして実行すると、結果は次のようになります。

Float  10^-20
Double 10^-20

これの理由は何ですか?

4

3 に答える 3

2

私は自分のコメントを答えにして、それを拡張すると思います。これは私の仮説です、間違っているかもしれません。

Windows 上の MinGW は、式の中間部分を x86 の完全な 80 ビット精度に昇格させることで、精度を維持しようとしている可能性があります。

したがって、式の両辺はn != (n-dec)64 ビットの精度で評価されます (80 ビットの FP には 64 ビットの仮数があります)。

2^-64 ~ 10^-20

したがって、数字は理にかなっています。

Visual Studio も (デフォルトで) 中間体をプロモートします。ただし、倍精度までです。

于 2011-10-09T08:09:07.947 に答える
0

これは、異なる環境がフロートとダブルに異なるサイズを使用していることを単に示しています。

C ++仕様によると、doubleは少なくともfloatと同じ大きさである必要があります。システム上のタイプの大きさを知りたい場合は、を使用してくださいsizeof

テストで示されているように、g ++はfloatとdoubleに別々のサイズ(それぞれ32ビットと64ビット)を使用しますが、WindowsシステムのMinGW32は両方に同じサイズを使用します。どちらのバージョンも標準に準拠しており、どちらの動作も一般的に信頼できません。

于 2011-10-09T08:23:05.743 に答える
0

両方の OS で float と double のサイズを確認しないのはなぜですか?

于 2011-10-09T08:04:31.040 に答える