0

Matlabの倍精度数を理解しようとしています。この1-3*(4/3-1)がゼロに等しくないのはなぜですか?

4

3 に答える 3

6

実数 4/3 は 2 進有理数ではないため、倍精度 (またはその他の 2 進浮動小数点形式) では表現できません。4/3したがって、 MATLAB で計算すると、得られる値は最も近い表現可能な倍精度数に丸められます。これは正確には次のとおりです。

1.3333333333333332593184650249895639717578887939453125

この値から 1 を引くことは正確です (互いに 2 の因数以内の数を正確に引くことは、FP エラー分析のよく知られた定理です)。したがって、 の結果4/3 - 1は次のようになります。

0.3333333333333332593184650249895639717578887939453125

この数を 3 倍した結果も正確に表現できる場合があります。

0.9999999999999997779553950749686919152736663818359375

最後に、1.0 からの減算も正確です (前に参照した定理により)。

0.0000000000000002220446049250313080847263336181640625

したがって、4/3 は double として表すことができないため、計算の丸め誤差の原因は 1 つだけであり、計算の最終結果は単純に最初の誤差が繰り越されたものになります。

于 2013-03-12T12:59:23.550 に答える
1

Running this on a scientific calculator - log2(2.2204e-16) - yields (almost) exactly -52. In other words, Matlab stores 52 bits of precision in a double, with another 5 bits for the exponent (4 + sign) and one for the sign of the significand. This is in line with the IEEE 754 implementation: 53 bits for the significand (52 + sign) and 5 for the exponent. All is well! As always, you should test whether two floating point numbers are close enough, not whether they are exactly equal. An appropriate example in Matlab would look like:

if abs(x - y) < 1e-15
      % Some code to execute when x and y are approximately equal
else
      % Some other code
end

The statement of adherence to IEEE 754 comes from the wikipedia article.

于 2013-03-12T03:36:25.127 に答える
0

問題は の計算から始まります4/3。正確な答えは、有限の 10 進数の桁数でも有限のビット数でも表現できません。結果は次のように格納されます4/3+r。r は、4/3 の実数値と 4/3 に最も近い IEEE 754 64 ビット 2 進浮動小数点数 (丸め誤差) との差を表す小さな絶対値の符号付き数値です。

1 を引くと になり1/3+rます。3 を掛けると が得られ1+3rます。1 からそれを引くと になり-3rます。

最終結果は、4/3 の元の表現の丸め誤差の -3 倍になります。

于 2013-03-12T12:53:26.367 に答える