等しくない場合、それははMATLAB内の2つの等しい浮動小数点数を減算すると、我々は2つの異なる方法で(A + B)を計算したいと0
(A + B)*(ありますここでA + B)
+ 2 AB + B
、a = 1.4
とb = -2.7
とします。
a = 1.4;
b = -2.7;
format long
r = (a + b) * (a + b)
r2 = a^2 + 2*a*b + b^2
abs_diff = abs(r - r2)
私は
r = 1.690000000000001
r2 = 1.690000000000001
abs_diff = 6.661338147750939e-16
はここで何が起こっているの入手:我々はformat long
と数式でこれら2つの数値を差し込む場合は、私たちは、私は次のスクリプトを実行した場合、つまり、どちらの場合1.690000000000001
で入手しますか? r
またはr2
(Matlabは異なる浮動小数点演算を実行するため)異なる結果をプレビューできますが、その差の絶対値はプレビューできません。
また、私は
rel_err1 = abs(1.69 - r)/1.69
rel_err2 = abs(1.69 - r2)/1.69
をすれば、私は
rel_err1 = 3.941620205769786e-16
rel_err2 = 7.883240411539573e-16
これは私だけがr
が実際にはないと思いますが入手r
とr2
の相対誤差は、つまり、異なっていることに気づきました同じr2
。彼らが本当に違うならば、完全に見える方法はありますか?そうでない場合、何が起こっていますか?
また、両方の相対エラーがeps/2
より小さくない場合、これはオーバーフローが発生したことを意味しますか?はいの場合、どこですか?
注:これは特定のケースです。私は浮動小数点数と丸め誤差を扱っていることを理解しました。しかし、私は、この例を辿ることによって、より良いことを理解したいと思います。
のためにそれは可能性があります浮動小数点エラーが発生するという事実操作の* order *、* type *、* number *にdsを指定します。あなたの2つのメソッドは異なる数と種類の操作を持っています。理論的には、浮動小数点エラーの数が増えています(http://floating-point-gui.de/errors/propagation/)。また、より多くの操作がエラーのより多くの伝播を引き起こします。 – Suever
@Suever私の直感は、両方のメソッドが実際には異なる浮動小数点演算を使用して実装されているため、異なる結果が得られ、その差が0(とにかく)であることを説明します。しかし、Matlabは同様に 'r'と' r2'を同じように表現するので、それらの違いは0でなければなりません... – nbro
MATLABが 'r'と' r2'を同じように表現していることをあなたのポストで示していますか? – Suever