機械イプシロン
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
少し前にTwitterで、ε-δ論法に関連して、計算機イプシロンな...
そして何の気なしに[[Wikipedia で計算機イプシロン>https://...
まじかよと思って調べてみた。
検証環境
Visual Studio 2013 Professional Update 5
OS Windows 7 64bit Ultimate
#contents
*結論 [#r77de859]
MSDNの定義の通りに解釈すると、計算機イプシロンの意味をな...
MSDNの定義の通りの値だと、FLT_EPSILONより小さい値となって...
*C/C++におけるfloat [#dd6e9086]
-計算機イプシロンの解説をする前に、floatをはじめとする浮...
-C/C++におけるfloat は32bit幅であり、その内部はbitごとに...
--31(MSB) 符号ビット
--30:23 指数部
--22:0 仮数部
-という具合に、MSB(最上位ビット)から順番に1:8:23 の割合で...
--最上位ビットの符号ビットは、いわゆるsigned int と同じ挙...
--その次の指数部と仮数部は、浮動小数点の浮動小数点らしさ...
--指数部は、その数の絶対的な大きさを表す。
--仮数部は、数の細かい部分を表す。
--合わせて、''(指数部)x(仮数部)''の掛け算で浮動小数...
-仮数部は23ビットあり、0から始まって数が大きくなるほど仮...
-なので、浮動小数点と言いつつも、基本的には離散的にしか実...
*計算機イプシロンの定義 [#s42d9239]
-さて、Wikipediaによれば、計算機イプシロンの定義は、
> 「1より大きい最小の数」と1との差のことである
-と定義されている。¬e{machine-epsilon-ja-wikipedia};
-一方で、MSDNによると計算機イプシロンの定義は
> (1+x != 1)となる最小のx
-とある。¬e{MSDN-machine-epsilon};
-一見すると、同じように見えるのだが、実は厳密には違うとい...
*16進数での表記 [#yf73e06d]
-先に説明したように、floatも16進数で表記すれば離散値で表...
-このとき、1.0は、16進数表記で ''0x3f800000'' となる。...
-これらの掛け算&mimetex(+1 \times 2^0 \times 1.0 = 1.0);...
-0x3f800000 の次に大きい数は、0x3f800001 であり、10進数で...
-1との差分は&mimetex(1.192092896^{-7});(0.000000119209289...
-試しに、どれぐらい小さい値なのか、ちょっと検証コードを書...
#geshi(c++){{
return 0;
}}
-なおコード全体はこちら。
-コードは、読めばわかると思うが、1 + x が1と等しくなるま...
-結果、xが0.00000011920928960、つまりFLT_EPSILONのときは...
それぞれ、約1/8388608=1/(2^23)と、1/16777216=1/(2^24) で...
-このコードだけ見ると、うっかり「MSDNの説明も合ってるんじ...
-今度はもうひとつ検証コードを書いてみよう。
-FLT_EPSILONは正の実数であるので、1.0と0の間に存在する。...
#geshi(c++){{
return 0;
}}
-この実行結果が以下の通り。
1.00000011920928960e+000 5.9604651881e-008 ...
-この通り、FLT_EPSILONの約半分、0.000000059604651881 を加...
これがなんで起きるのかは、すでに冒頭のWikipediaにも書かれ...
-つまり、加算した結果がfloatで表せるちょうどの値にないと...
-このあたりの丸めの挙動も、本当はround to even、round to ...
**ULPについて [#c10c670a]
-FLT_EPSILONはなるべく実数に近い話を想定して書かれている...
-以下に表を記すが、
|1|0x3f800000|
|1.00000011920928960|0x3f800001|
|FLT_EPSILON|0x34000000|
-という具合に、16進数で表した場合に、いくつずれているか、...
-この16進数で表した際にいくつずれているか、というのを表す...
-このULPがいわゆるfloatが表せる細かさの限度なのだが、この...
1 + x != 1 と 1 - x != 1
-ULPは、指数部によって、絶対値が変わると述べたばかりだが...
*なにゆえ、1なのか? [#p329ea8b]
-もともとのツイートは、ε−δ論法から発展して、FLT_EPSILON ...
-現に、本当にfloatで表せる最小の数として、マクロFLT_MINが...
-じゃあ、なんでFLT_EPSILONは1基準なのかという話なのだが、...
-元来、FLT_EPSILONは十分小さい、という意味で使われている...
-これがFLT_MINだと、本当に最小の数字なので、それより小さ...
-なので、指数のレンジのちょうど真ん中である、1を基準にFLT...
1.1920928955e-007 0x34000000
1.00000000000000000e+000 5.9604644775e-008 ...
終了行:
少し前にTwitterで、ε-δ論法に関連して、計算機イプシロンな...
そして何の気なしに[[Wikipedia で計算機イプシロン>https://...
まじかよと思って調べてみた。
検証環境
Visual Studio 2013 Professional Update 5
OS Windows 7 64bit Ultimate
#contents
*結論 [#r77de859]
MSDNの定義の通りに解釈すると、計算機イプシロンの意味をな...
MSDNの定義の通りの値だと、FLT_EPSILONより小さい値となって...
*C/C++におけるfloat [#dd6e9086]
-計算機イプシロンの解説をする前に、floatをはじめとする浮...
-C/C++におけるfloat は32bit幅であり、その内部はbitごとに...
--31(MSB) 符号ビット
--30:23 指数部
--22:0 仮数部
-という具合に、MSB(最上位ビット)から順番に1:8:23 の割合で...
--最上位ビットの符号ビットは、いわゆるsigned int と同じ挙...
--その次の指数部と仮数部は、浮動小数点の浮動小数点らしさ...
--指数部は、その数の絶対的な大きさを表す。
--仮数部は、数の細かい部分を表す。
--合わせて、''(指数部)x(仮数部)''の掛け算で浮動小数...
-仮数部は23ビットあり、0から始まって数が大きくなるほど仮...
-なので、浮動小数点と言いつつも、基本的には離散的にしか実...
*計算機イプシロンの定義 [#s42d9239]
-さて、Wikipediaによれば、計算機イプシロンの定義は、
> 「1より大きい最小の数」と1との差のことである
-と定義されている。¬e{machine-epsilon-ja-wikipedia};
-一方で、MSDNによると計算機イプシロンの定義は
> (1+x != 1)となる最小のx
-とある。¬e{MSDN-machine-epsilon};
-一見すると、同じように見えるのだが、実は厳密には違うとい...
*16進数での表記 [#yf73e06d]
-先に説明したように、floatも16進数で表記すれば離散値で表...
-このとき、1.0は、16進数表記で ''0x3f800000'' となる。...
-これらの掛け算&mimetex(+1 \times 2^0 \times 1.0 = 1.0);...
-0x3f800000 の次に大きい数は、0x3f800001 であり、10進数で...
-1との差分は&mimetex(1.192092896^{-7});(0.000000119209289...
-試しに、どれぐらい小さい値なのか、ちょっと検証コードを書...
#geshi(c++){{
return 0;
}}
-なおコード全体はこちら。
-コードは、読めばわかると思うが、1 + x が1と等しくなるま...
-結果、xが0.00000011920928960、つまりFLT_EPSILONのときは...
それぞれ、約1/8388608=1/(2^23)と、1/16777216=1/(2^24) で...
-このコードだけ見ると、うっかり「MSDNの説明も合ってるんじ...
-今度はもうひとつ検証コードを書いてみよう。
-FLT_EPSILONは正の実数であるので、1.0と0の間に存在する。...
#geshi(c++){{
return 0;
}}
-この実行結果が以下の通り。
1.00000011920928960e+000 5.9604651881e-008 ...
-この通り、FLT_EPSILONの約半分、0.000000059604651881 を加...
これがなんで起きるのかは、すでに冒頭のWikipediaにも書かれ...
-つまり、加算した結果がfloatで表せるちょうどの値にないと...
-このあたりの丸めの挙動も、本当はround to even、round to ...
**ULPについて [#c10c670a]
-FLT_EPSILONはなるべく実数に近い話を想定して書かれている...
-以下に表を記すが、
|1|0x3f800000|
|1.00000011920928960|0x3f800001|
|FLT_EPSILON|0x34000000|
-という具合に、16進数で表した場合に、いくつずれているか、...
-この16進数で表した際にいくつずれているか、というのを表す...
-このULPがいわゆるfloatが表せる細かさの限度なのだが、この...
1 + x != 1 と 1 - x != 1
-ULPは、指数部によって、絶対値が変わると述べたばかりだが...
*なにゆえ、1なのか? [#p329ea8b]
-もともとのツイートは、ε−δ論法から発展して、FLT_EPSILON ...
-現に、本当にfloatで表せる最小の数として、マクロFLT_MINが...
-じゃあ、なんでFLT_EPSILONは1基準なのかという話なのだが、...
-元来、FLT_EPSILONは十分小さい、という意味で使われている...
-これがFLT_MINだと、本当に最小の数字なので、それより小さ...
-なので、指数のレンジのちょうど真ん中である、1を基準にFLT...
1.1920928955e-007 0x34000000
1.00000000000000000e+000 5.9604644775e-008 ...
ページ名: