C 言語での計算機イプシロンを確認する方法を見つけたので、 C# でも実行してみることにしました。
計算機イプシロン
Machine Epsilon
正数 ε に対して 1+ε という演算を行ったとき、記憶領域は有限なので ε が小さすぎると無視されるが、無視されないで加えられる尤も小さい数をマシン・エプシロンと呼んでいる。
実際に値を 1.0 から半分にしていくと、浮動小数点数の表現上 1.0 とその値を足しても 1.0 とみなされる場合が出てきます。そのときの 1.0 と足して 1.0 とならない直前の値が計算機イプシロンです。
C# で小数を表す基本の型は float
、 double
、 decimal
があるので、すべてについてみていきます。プログラムは単純に型を変えるだけなので、まとめて出してしまいます。ソースコード等はこちらから
18 | static void CalcFloatEpsilon() |
計算結果は次の通りです。(長い…)
1 | 1.500000000000000000000000000000e+000 |
各型での ε をまとめると下のようになります。
型 | 計算機イプシロン( ε ) |
---|---|
float |
1.192092900000000000000000000000e-007 |
double |
2.220446049250313100000000000000e-016 |
decimal |
1.000000000000000000000000000000e-028 |
ISO に準拠しているため float
と double
は C 言語など、他の言語のときと同じ結果となっています。
さすがの decimal
という感じで、 decimal
の正の最小の数字がそのまま ε となっています。