1. ホーム
  2. matlab

[解決済み] Matlabでεの機械値を求める

2022-02-18 16:58:50

質問

次の Matlab コードは、εの機械値を求めるためのものである。

e = 1; 
while (1+e>1) 
    if e+1 <= 1
        e = 2*e;
    else e = e/2; 
    end
end
e = 2*e

イプシロンの値は正しく近似されますが、コードを修正すると予期せぬ結果になります。例えば、whileループの条件をe>0に変更すると、プログラムがクラッシュするか、定数を追加しても不等式が変わらないのにεの近似値ではなく0が出力されます。なぜこのようなことが起こるのか、どなたか説明していただけないでしょうか。

e = 1; 
while (e>0) 
    if e+1 <= 1
        e = 2*e;
    else e = e/2; 
    end
end
e=2*e

解決方法は?

イプシロン」のコンセプトは、「1」に「1」を足すと別の値になるような最小値が存在する、というものです。もし e がイプシロンより小さい場合 1+e==1 . 浮動小数点数は 1 と 1 + ε の間の値を表すことができません。

そこでwhileループの条件を置き換える。 1+e>1 である。 e>0 数学的には等価ですが、私たちが定義しようとしている概念、すなわち、1から大きな値を得るために1に加える最小の値としてのイプシロンが壊れています。 10のような0に非常に近い値を表現することができることに注意してください。 -300 しかし、1に近い値を表現することはできません。イプシロンが約10 -16 . これは、浮動小数点数を扱う場合、2つの不等式が同じではないことを意味します。


なお、この文は if e+1 <= 1 が到達するのは 1+e>1 ということで、常にfalseになります。このif文を削除し、if文の中のコードだけを残すことで、コードを簡略化することができます。 else 節があります。

e = 1;
while 1+e > 1
   e = e/2;
end
e = 2*e