[解決済み] MATLABでマシンイプシロンを計算する方法は?
質問内容
機械εを求める必要があり、以下のようにしています。
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
キーワードはコードから削除してください。 また
eps
を実際の変数として使用します。 これはMATLABであらかじめ定義された関数で、以下の計算を行います。
マシンイプシロン
を計算しようとしているのです。 という変数を作ることで
eps
そのため、この関数を必要とするMATLABの他の関数が予期せぬ動作をすることになり、それはあなたが望むことではありません。
代わりに何か別のものを使ってください。
macheps
. また、アルゴリズムが少し間違っています。 をチェックする必要があります。
1.0 + (macheps/2)
の中に
while
ループではなく
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
ボーナス
ご存じないかもしれませんが、マシンイプシロンとは、浮動小数点演算による相対誤差の上限を示すものです。 言い換えれば、浮動小数点数を格納するために使用されるビット数が有限であるため、真の浮動小数点数とコンピュータで計算されたものとの間に予想される最大の差になります。
思い起こせば、浮動小数点数はどうしてもコンピュータ(あるいはかなりのデジタル機器)では2進数のビットで表現される。 という点では
IEEE754浮動小数点規格
MATLABは、すべての数値が以下のような型であると仮定しています。
double
これは浮動小数点数を64ビットで表します。 明示的に別の型にキャストすることで、この動作をオーバーライドできることは明らかです。 IEEE 754 浮動小数点規格では
double
の精度を表す52ビットがあります。
分数
の部分は、数値の一部です。
ここで、私が言っていることを分かりやすく図にしてみました。
出典 ウィキペディア
符号用に1ビット、指数基底用に11ビット、そして最後に分数部用に52ビットが確保されているのがわかる。 これを合計すると64ビットになる。分数部は2を底とし、-1から-52までの負の指数を持つ数値の集合または総和である。 浮動小数点数のMSBは次のように始まります。
2^{-1}
まで、すべて
2^{-52}
をLSBとする。 基本的に、マシンイプシロンは、2つの数値が以下のようなものであると仮定して、2進数で1ビット増加した場合の最大解像度差を計算します。
同じ
記号と
同じ
指数基底 技術的に言えば、マシン・イプシロンが実際に等しいのは
2^{-52}
というのは、先ほどお話したような条件がある場合、浮動小数点の1ビットの分解能はこれが最大だからです。
実際に上のコードをよく見てみると、2による除算は
ビットシフト
を1回繰り返すごとに1つずつ右へ移動し、全数1、つまり
2^{0}
そして、この数値を取り、これを1に加えます。 このビットシフトした値に1を足した値が何になるかを見ながらビットシフトを続け、右にビットシフトしたときに変化がなくなるところまで行きます。 これ以上右へビットシフトすると、値は次のようになります。
0
アンダーフローによるものであるため
1.0 + 0.0 = 1.0
であり、これはもはや
> 1.0
というもので、これは
while
ループがチェックしています。
一度
while
ループが終了すると、この閾値がマシンイプシロンを定義することになります。 もし興味があるなら、もしあなたが
2^{-52}
をコマンドプロンプトで実行すると、次のようになります。
eps
が等しい。
>> 2^-52
ans =
2.220446049250313e-16
これは、1ビットを52回右にシフトしているので、ループが停止する前のポイントはLSBであり、次のようになります。
2^{-52}
. 念のため、もしカウンターを
while
ループの中で、何回
while
を実行すると、ちょうど52回実行されることになり、これは52ビット右シフトすることを意味します。
macheps = 1;
count = 0;
while 1.0 + (macheps/2) > 1.0
macheps = macheps / 2;
count = count + 1;
end
>> count
count =
52
関連
-
[解決済み】MATLABのエラー「この課題にはスカラー構造が必要です」は、この文の何を指しているのか?
-
[解決済み] ある行列から固有ベクトルの異なる解を得ることができるでしょうか?
-
[解決済み] 部分ピボットによるガウス消去の実装【終了しました
-
[解決済み] matlabでrandnを持つ確率変数の範囲はどうなっていますか?
-
[解決済み] エラー「Improper assignment with rectangular empty matrix」の解決方法を教えてください。
-
[解決済み] python numpy マシーンイプシロン
-
[解決済み] データの補間は失敗:グリッドベクトルは与えられた値に一致する点のグリッドを定義しない
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Matlabのfprintfを使用してテーブルを作成する
-
[解決済み] Matlabの角括弧と中括弧の違い?
-
[解決済み] 単純論理条件フラグ MATLAB
-
[解決済み] プロットを回転させる?
-
[解決済み] Matlab - 連立方程式を解くときにvpasolveエラーが発生する
-
[解決済み] データの補間は失敗:グリッドベクトルは与えられた値に一致する点のグリッドを定義しない
-
[解決済み] キュービックスプライン補間と多項式補間の比較
-
[解決済み] matlab のプロットベクトルは同じ長さでなければなりません。
-
[解決済み] MatlabでY軸のプロット範囲を調整する方法は?
-
[解決済み] RGBカラーによるMATLABプロット