eps は 1.0 から次に大きい倍精度数までの距離を返すので、これを使用して負の重み位置の数値を解釈できます。しかし、高い正の重み位置の値を持つ非常に大きな数の場合、何を使用して解釈できますか?
つまり、Matlab で取得した数値の計算ノイズを数えるための参照が必要です。
eps は 1.0 から次に大きい倍精度数までの距離を返すので、これを使用して負の重み位置の数値を解釈できます。しかし、高い正の重み位置の値を持つ非常に大きな数の場合、何を使用して解釈できますか?
つまり、Matlab で取得した数値の計算ノイズを数えるための参照が必要です。
「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」を読みましたか?
丸め誤差 (「計算ノイズ」と呼ばれるもの)、浮動小数点数の表現に関する IEEE 754 標準、およびコンピューターでの浮動小数点演算の実装について説明します。
このホワイト ペーパーを読むことで、あなたの質問に対する答えが得られると思います。少なくとも、浮動小数点演算がどのように機能するかを正確に理解できるようになると思います。
理解を助けるためのいくつかの説明 - @Richante の投稿のコメントに収まらないほど大きい:
realmin
まず、との違いeps
:
realmin
正規化された最小の浮動小数点数です。より小さな数値を非正規化形式で表すことができます。eps
異なる数値間の最小増分です。realmin
= eps(realmin) * 2^52
.「正規化」および「非正規化」浮動小数点数については、上記のリンク先の論文で説明されています。
第 2 に、丸め誤差は、n
数字の 1 桁目をどれだけ「信頼」できるかを示すものではありません。
たとえば、次のようにします。
>> ((0.1+0.1+0.1)^512)/(0.3^512)
ans =
1.0000
自分で割っ0.3^512
ているので、答えはちょうど1になるはずですよね?までのすべての数字を信頼できるはずeps(1)
です。
この計算のエラーは、実際には次の400 * eps
とおりです。
>> ((0.1+0.1+0.1)^512)/(0.3^512) - 1
ans =
9.4591e-014
>> ans / eps(1)
ans =
426
計算誤差、つまり 1 桁目が信頼できない程度は、答えの表現における浮動小数点の丸め誤差n
よりもはるかに大きくなります。eps
ここでは 6 つの浮動小数点演算しか行っていないことに注意してください。何百万もの FLOP を簡単に積み上げて、1 つの結果を生成できます。
もう一度言いますが、 は計算のエラーの指標でeps()
はありません。「私の結果は 1234.567 +/- eps(1234.567) です」と表示しないでください。それはあなたの数値が実際よりも正確であることを意味するため、無意味で欺瞞的です.
eps
、回答の表現における丸め誤差は、わずか 1 兆分の 1 兆程度です。あなたの本当の敵は、浮動小数点演算を行うたびに蓄積される誤差であり、意味のある誤差の推定を追跡する必要があります。
Li-aung Yip が推奨する紙よりも消化しやすいのは、マシン イプシロンに関するウィキペディアの記事です。次に、What Every Computer Scientist ...を読みます。
あなたの質問はあまりよく表現されていませんが、数値から次に小さい倍精度数値までの距離を与えるものが必要だと思いますか?この場合は、次を使用できます。
x = 100;
x + eps(x) %Next largest double-precision number
x - eps(-x) %Next smallest double-precision number
倍精度数には1つの符号ビットがあるため、負の数からカウントアップすることは、正の数からカウントダウンすることと同じです。
編集:help eps
「すべてのXについて、EPS(X)はEPS(ABS(X))と等しい」によると。これは本当に私を混乱させます。それが、単一の符号ビットを持つdoubleと、値が等間隔に配置されていないこととどのように一致するかがわかりません。