[解決済み] 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
関連
-
[解決済み] MATLABで「連結される配列の次元が一致しない」というエラーをデバッグする。
-
[解決済み] 演算子のオペランドは、論理スカラー値に変換可能でなければならない。
-
[解決済み] ベクトルにおける四分位値の0.25から0.75までの数値 MATLAB
-
[解決済み] なぜSIFTはMatlabで利用できないのですか?
-
[解決済み] matlabの*と.*の違いは何ですか?
-
[解決済み] 行列の行にノルム関数を適用する - Matlab [duplicate]
-
[解決済み] MatLab: 関数の引数を設定する
-
[解決済み] MATLABのパスに影をつける」とはどういう意味ですか?ファイル内で行うにはどうしたらいいですか?
-
[解決済み] MATLABのコードヘルプです。バックワードオイラー法
-
[解決済み] MATLABでヒストグラムを正規化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン