マシンのイプシロンを見つける必要があり、次のことを行っています。
eps = 1;
while 1.0 + eps > 1.0 do
eps = eps /2;
end
しかし、それは私にこれを示しています:
Undefined function or variable 'do'.
Error in epsilon (line 3)
while 1.0 + eps > 1.0 do
私は何をすべきか?
マシンのイプシロンを見つける必要があり、次のことを行っています。
eps = 1;
while 1.0 + eps > 1.0 do
eps = eps /2;
end
しかし、それは私にこれを示しています:
Undefined function or variable 'do'.
Error in epsilon (line 3)
while 1.0 + eps > 1.0 do
私は何をすべきか?
何よりもまず、do
MATLAB にはキーワードのようなものがないため、コードからそれを削除してください。eps
また、実際の変数として使用しないでください。これは、計算しようとしているマシン epsilonを計算する MATLAB の定義済み関数です。という名前の変数を作成するとeps
、実際の関数が隠れてしまい、その使用を必要とする MATLAB の他の関数が予期せぬ動作をすることになり、それは望ましくありません。
など、代わりに別のものを使用してくださいmacheps
。また、あなたのアルゴリズムは少し間違っています。1.0 + (macheps/2)
ではなく、while
ループでfor をチェックする必要があります1.0 + macheps
。
つまり、次のようにします。
macheps = 1;
while 1.0 + (macheps/2) > 1.0
macheps = macheps / 2;
end
コマンド プロンプトで入力2.22 x 10^{-16}
すると、MATLAB と一致する が得られます。eps
再確認するには:
>> format long
>> macheps
macheps =
2.220446049250313e-16
>> eps
ans =
2.220446049250313e-16
ご存じないかもしれませんが、マシンのイプシロンは、浮動小数点演算による相対誤差の上限です。つまり、これは、浮動小数点数を格納するために使用されるビット数が有限であるため、実際の浮動小数点数とコンピューターで計算される浮動小数点数との間で予想される最大の差になります。
思い出すと、浮動小数点数は必然的にコンピューター (またはほぼすべてのデジタル) でバイナリ ビットとして表されます。IEEE 754 浮動小数点標準に関して、MATLAB はすべての数値が 型double
であると想定します。これは、浮動小数点数を 64 ビットとして表します。別の型に明示的にキャストすることで、この動作を明らかにオーバーライドできます。IEEE 754 浮動小数点標準では、精度タイプの数値の場合、数値の小数double
部分を表す 52 ビットがあります。
これが私が話していることの素晴らしい図です:
出典:ウィキペディア
数値の符号用に予約されている 1 ビット、指数の基数用に予約されている 11 ビット、最後に小数部用に予約されている 52 ビットがあることがわかります。これは合計で 64 ビットになります。小数部分は、基数 2 の数値の集合または合計であり、負の指数は -1 から -52 までです。浮動小数点数の MSB は から始まり、LSB2^{-1}
まで続きます。基本的に、マシン イプシロンは、2 つの数値が同じ符号と同じ指数ベース2^{-52}
を持っている場合、2 つの数値間の 2 進数で 1 ビット増加する最大分解能差を計算します。技術的に言えば、マシンのイプシロンは実際には2^{-52}
前に説明した条件を考えると、これは浮動小数点の単一ビットの最大解像度であるためです。
上記のコードを実際によく見ると、2 による除算は、1 の整数値から開始して、反復ごとに 1 桁ずつ数値を右にビットシフト2^{0}
することであり、この数値を取得してこれを 1 に加算します。 . ビット シフトを続け、このビット シフトされた値を 1 だけ加算することによって値が等しいことを確認し、右にビット シフトしたときに変化が記録されなくなるポイントまで進みます。これ以上右にビットシフトすると、アンダーフローにより値が01.0 + 0.0 = 1.0
になり、これはもはやではなくなり> 1.0
、これがwhile
ループでチェックされます。
ループが終了すると、while
マシンのイプシロンを定義するのはこのしきい値です。2^{-52}
興味がある方は、コマンド プロンプトをパンチインすると、次のような結果が得られますeps
。
>> 2^-52
ans =
2.220446049250313e-16
これは、1 ビットを右に 52 回シフトしているため意味があり、ループが停止する前のポイントはその LSB であり、2^{-52}
. 完全を期すために、ループ内にカウンターを配置し、ループが実行while
された回数をカウントアップすると、正確に 52 回実行され、右への 52 ビット シフトを表します。while
macheps = 1;
count = 0;
while 1.0 + (macheps/2) > 1.0
macheps = macheps / 2;
count = count + 1;
end
>> count
count =
52
次のようなものが必要なようです。
eps = 1;
while (1.0 + eps > 1.0)
eps = eps /2;
end