1

フロート変数をカウンターとして使用する必要があるとします-たとえば

float i = 1;
float previ = 0;
do 
{
   previ = i;
}
while (i++);

i のどの値で (i-previ) は 1 と異なるでしょうか? その差は整数のままでしょうか、それとも有理数の非整数になるのでしょうか?

4

1 に答える 1

9

浮動小数点の最も一般的な実装である IEEE 754 では、32 ビット 2 進浮動小数点で表現できない最初の整数は 2 24 +1 (16,777,217) です。この時点で、2 24 (16,777,216) と 2 24 +2 (16,777,218) が表現可能です。

16,777,216 に 1 を加算すると、正確な数学的結果は 16,777,217 になります。これは表現できないため、表現可能な値に丸められます。最も一般的なデフォルトの丸めモードは、最近接への丸めです。ただし、16,777,216 と 16,777,218 は両方とも 16,777,217 から等距離にあります。同数の場合は、偶数下位ビット (浮動小数点仮数) の値が選択されます。したがって、16,777,216 が返されます。

したがって、浮動小数点値に 1 を繰り返し加算すると、0 から始まり、16,777,216 に達するまでカウントが続き、その後 16,777,216 が連続して生成されます。

16,777,217 が最初の表現不可能な整数である理由は、IEEE 754 の 32 ビット バイナリ形式が仮数 (小数部分) に 24 ビットを使用するためです。(23 ビットが明示的に格納されます。上位ビットは暗黙的に通常の値の 1 です。) したがって、24 ビットで表現できるすべての整数は表現可能です。2 24は名目上、25 整数ビット (2 24から 2 0まで) を必要とします。ただし、24 個の上位ビットのみを使用してもエラーは発生しません (1•2 24として表されます)。欠落している下位ビットはゼロになるからです。逆に、16,777,217 は、欠落しているビットを 1 にする必要があるため、表すことができません。

于 2013-02-26T16:56:57.247 に答える