5

マシンのイプシロンを見つける必要があり、次のことを行っています。

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

私は何をすべきか?

4

3 に答える 3

24

何よりもまず、doMATLAB にはキーワードのようなものがないため、コードからそれを削除してください。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
于 2014-12-16T18:54:03.323 に答える
0

次のようなものが必要なようです。

eps = 1;

while (1.0 + eps > 1.0)
    eps = eps /2;
end
于 2014-12-16T18:35:17.307 に答える