答えて

7

2.2は、2進浮動小数点で正確に表現できない倍精度です。実際には、double 2.2をfloatに変換した結果と、丸めを行い、doubleに戻した結果とを比較しています。二重仮定

は、IEEE 754の64ビット2進浮動小数点であり、フロートがIEEE 754 32ビット2進浮動小数点であり、2.2を10進数に最も近い二重正確な値2.20000000000000017763568394002504646778106689453125を有し、フロートに変換結果が2.2000000476837158203125あります。 floatをdoubleに戻しても値は変更されません。 2.20000000000000017763568394002504646778106689453125は2.2000000476837158203125と等しくありません。

2.5は、浮動小数点システムでfloatとdoubleの両方で正確に表現できるため、floatへの変換もdoubleへの変換も値を変更しません。 2.5は2.5に等しい。私は以下を参照してくださいドキュメントを通って行くhttp://www.cs.yale.edu/homes/aspnes/pinewiki/C(2f)FloatingPoint.html


2

浮動小数点数はcontain round-off error
参考に可能性があります。 (ポイント6上記URLで)一般に

、浮動小数点数は正確ではない:それらはための固定数の仮数の切り捨ての丸め誤差を含む可能性がありますビット。

誤差を累積しないようにする最も簡単な方法は、高精度浮動小数点数を使用することです(これはfloatではなくdoubleを使用することを意味します)。現代のCPUでは、そうすることに時間がほとんどかかりません。

丸め誤差の結果の1つは、浮動小数点数が等しいかどうかをテストすることは非常に難しいということです。上記の正確な値。例えば、(0.1 + 0.1 + 0.1)== 0.3の場合は、一般的にそうではありません。これは、(f = 0.0; f < = 0.3; f + = 0.1 ):ループ本体がf = 0.3で実行されるかどうかを事前に予測することは難しいでしょう。 (0.3 = 0.3、f + = 0.1)を書いても0.3の値を書き込んだほうがはるかに高い評価を得ています。私は最終的に、それに0.1を加えることは効果がないくらい大きいfの一定の値に収束すると思われる)。

+0

通常、OPにビットを当てるものには「表現エラー」という名前を使用し、OPには「丸め誤差」を予約します。計算結果。特に、あなたが引用している長い段落は、「累積誤差」について起こります。これは、ここでは意味をなさない.1つの計算がないからです。 '=='は、(C99標準に忠実な努力を最小限に抑えたコンパイラのために)計算がなければ、予測可能に動作するという完全に有効な期待です。 –

関連する問題