2016-04-28 24 views
0

浮動小数点演算の間に発生する浮動小数点の誤差と四捨五入誤差を読み取っています。浮動小数点演算

IEEE 754 - 単精度/倍精度形式の記事をたくさん読んでいます。 私は符号ビット、8(または)11ビットの指数、23(または)52ビットの仮数部、暗黙の先頭ビットがあることを理解します。

私も、私は0.1 + 0.1 + 0.1ではないことを理解

.....その分母が2の主要因ではない実数は、バイナリで例えば、0.1の場合は正確に表現することはできませんが0.0001100110011であることを知っています丸め誤差の累積のため0.3に等しくなります。

また0.5は1/2であるため、バイナリ形式でも正確に表現できます。 しかし、0.1 + 0.1 + 0.1 + 0.1 + 0.1 = 0.5という理由で丸め誤差の上記の累積を考えるとわかりません。

+0

あなたは '0.1' 5回を蓄積するときに、* *丸め誤差を得ないと言っていますか? – MooseBoys

+0

エラーが0.1回加算されたときにエラーの累積が捨てられるか、バイナリで正確に表現可能な数につながる他の算術が混乱しているのは混乱します。 – chebus

+0

新しい値によって不正確さが失われた場合にのみ、不正確さが失われます。 –

答えて

2

最も近い偶数モードのIEEE754では、いくつかの素晴らしいプロパティがあります。任意の有限のfloat xとnは< 54用
まず、X (^ N-1 2)X + X == 2^n個Is 3*x+x always exact?

を参照してください。そして、あなたはまた、(2^N + 1)はx == 2^x + x
(正確に2^n + 1が正確に表現できる限り、n <53)。これらの施設の中でも

、あなたが持っている

  • 0.1 + 0.1 == 2 * 0.1
  • 0.1 + 0.1 + 0.1 == 3 * 0.1
  • 0.1 + 0.1 + 0.1 + 0.1 == 4 * 0.1
  • 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 5 * 0.1

この段階では、0.1が正確に1/10ではないので、何も5 * 0.1ことを証明していないので、これは、十分ではありません== 0.5。
例えば、3 * 0.1!= 0.3,5 * 0.3!= 0.15。

ここでは単なる運があり、丸め誤差は累積ではなく消滅しました。
(n * 0.1 == n/10.0)は、整数nが1から100の間で100のうち65の場合に真です(この間隔では7の累乗でall)。

+0

したがって、誤差は5 * 0.3で累積されますが、53ビットが小数部では不十分で丸められた値が正確に0.5であるため、その値を四捨五入して見捨てられたと言います。 この間隔で7の累乗を意味するものが得られませんでしたか?一方、 – chebus

+0

では、0.3 + 0.3が0.6になり、6 * 0.1が0.6に等しくない理由を説明することができませんでした – chebus

1

倍精度での0.1は、バイナリで0.0001100110011001100110011001100110011001100110011001101です。のは、何が起こっているか確認するために、バイナリの追加をステップしてみましょう:

0.0001100110011001100110011001100110011001100110011001101 
+ 
    0.0001100110011001100110011001100110011001100110011001101 
----------------------------------------------------------- 
    0.001100110011001100110011001100110011001100110011001101 (52 sig bits -- OK) 
+ 
    0.0001100110011001100110011001100110011001100110011001101 
----------------------------------------------------------- 
    0.0100110011001100110011001100110011001100110011001100111 (54 sig bits -- must round to 53) 
    0.0100110011001100110011001100110011001100110011001101  (rounded up) 
+ 
    0.0001100110011001100110011001100110011001100110011001101 
----------------------------------------------------------- 
    0.0110011001100110011001100110011001100110011001100110101 (54 sig bits -- must round to 53) 
    0.01100110011001100110011001100110011001100110011001101 (rounded down) 
+ 
    0.0001100110011001100110011001100110011001100110011001101 
----------------------------------------------------------- 
    0.1000000000000000000000000000000000000000000000000000001 (55 sig bits -- must round to 53) 
    0.1              (rounded down) 

丸みが蓄積方法だからにより、0.1は5回が0.5になりました。

(私はbinary calculator、私のbinary converterからこれらの値を得て、floating-point converter。)

関連する問題