+/- INFでもNaNでもa<bでもない3つのIEEE-754フロートa、b、cが与えられた場合、a --c <b --cと仮定しても安全ですか?または、これが正しくない場合の例を挙げていただけますか?
1 に答える
aが約0.00000000000000001、bが約0.00000000000000002、cが1であると仮定すると、 a −cとb − cは両方とも-1に等しくなります。
(これは、倍精度、別名64ビット値を想定しています。より高精度の値の場合は、さらにゼロを追加する必要があります。)
説明を追加するために編集:
非正規化された値、数値以外の値、無限大などを無視し、具体的に確認するためにIEEE 754倍精度浮動小数点値に焦点を当てると、バイナリ表現の観点から、浮動小数点値は、符号ビットs(0は正、1は負)、11ビットの指数e(1023のオフセットで、e =0は2-1023を意味し、e = 1023は2を意味します)で構成されます。 0、つまり1)、および52ビットの固定小数点の有意数m(2進小数点を過ぎた52桁を表すため、有限精度で[0,1)の範囲になります)。したがって、表現の実際の値は(-1)です。s ×(1 + m)× 2e- 1023。
仮数は固定小数点であり、ビット数が固定されているため、精度は非常に有限です。1.00000000000000001のような値と1.00000000000000002のような値は、小数点以下の非常に多くの場所で同一です。倍精度の仮数よりも多くの場所が保持できます。
非常に大きな数と非常に小さな数の間で加算または減算を実行する場合(相互に関連して:この例では、1は「非常に大きい」です。あるいは、1を非常に小さい値として使用し、非常に大きい値を選択することもできます。値が10000000000000000)の場合、結果の指数はほぼ完全に非常に大きな数によって決定され、非常に小さな数の仮数は適切にスケーリングされる必要があります。私たちの場合、それは約1017で除算されます。だからそれは単に消えます。仮数は、それを区別するのに十分なビットを保持していません。