2

このコードを実行すると:

 #include <iostream>
 int main ()
 { 
     using namespace std;
     float a = 2.34E+22f;
     float b = a+1.0f;  
     cout<<"a="<<a<<endl;
     cout<<"b-a"<<b-a<<endl;
     return 0;
 }

浮動小数点数の有効桁数は 6 桁しかないため、結果は 0 になります。ただし、浮動小数点数 1.0 は 23 桁の数値に加算されます。では、プログラムはどのようにして 1 番の場所がないことを認識するのでしょうか? アルゴリズムは何でしょうか?

4

3 に答える 3

1

基本的な原則は、小数点が同じ場所になるように 2 つの数値を揃えることです。少し読みやすくするために 10 桁の数字を使用しています。

 a = 1.234E+10f;
 b = a+1.0f;

a + 1.0f を計算するときは、小数点を揃える必要があります。

 1.234E+10f becomes 1234000000.0
 1.0f       becomes          1.0
            + 
            =       1234000001.0

しかし、浮動小数点数であるため、右側の 1 は有効な範囲外であるため、格納される数値は次のようになり1.234000E+10ます。それを超える数字は、桁数が足りないため失われます。

[最適化コンパイラでこれを行う場合、浮動小数点ユニットが 64 ビットまたは 80 ビットの内部表現を使用するため、差として 1.0 が表示される場合があることに注意してください。変数 (そしてまともなコンパイラは確かにここでそれを達成することができます) 2.34E+22f では、64 ビット浮動小数点数に適合しないことが保証されており、おそらく 80 ビット浮動小数点数にも適合しません]。

于 2013-08-16T08:29:12.973 に答える
0

2 つの FP 数を加算すると、最初に同じ指数に変換されます。10 進数: 2.34000E+22 + 1.00000E0 = 2.34000E22 + 0.000000E+22. このステップでは、1.0 は丸めによって失われます。

2 進浮動小数点は、E+22 が 2^77 に置き換えられることを除いて、ほとんど同じように機能します。

于 2013-08-16T14:05:26.267 に答える