機械イプシロン
定義と性質
機械イプシロン (machine epsilon) は浮動小数点演算の丸めによって発生する相対誤差の上限を意味する。これはコンピュータ演算を使った数値解析特有のトピックである。macheps, unit roundoff または計算機イプシロンとも呼ばれ記号
数値解析において、機械イプシロンはしばしば値
一般的な言語で使用されている IEEE 754 定義の浮動小数点の機械イプシロンは以下の通り。ある値
| 精度 | 仮数bit | |
|
言語 |
|---|---|---|---|---|
| binary16 | 10+1bit | 0.0004883 | 0.000977 | Float16(Julia) |
| binary32 | 23+1bit | 5.9604645e-8 | 1.1920929e-7 | Float |
| binary64 | 52+1bit | 1.1102230246251565e-16 | 2.220446049250313e-16 | Double |
算出方法
浮動小数点の仮数部を一般化して考えてみよう。仮数部の数値表現
機械イプシロンは相対誤差の限界であるため指数
以上より、浮動小数点
なお
言語機能
C/C++
float.h に各精度の機械イプシロン long double は有効数字 64bit の拡張倍精度浮動小数点である。
#include <float.h>
printf("%.7e\n", FLT_EPSILON);
printf("%.15e\n", DBL_EPSILON);
printf("%.19Le\n", LDBL_EPSILON);
1.1920929e-07
2.220446049250313e-16
1.0842021724855044340e-19
Julia
Julia は標準機能として各浮動小数点精度の機械イプシロン eps() が用意されている。
julia> eps(Float16)
Float16(0.000977)
julia> eps(Float32)
1.1920929f-7
julia> eps(Float64)
2.220446049250313e-16
Java/
Scala/
C#
浮動小数点で表すことのできる最小の正の非正規化値が定義されているがこれは機械イプシロンではないため独自に定義する必要がある。Java/Scala ではべき乗演算による算出でも精度の範囲で差異はでないためリテラル化する必要はない。他は要確認。
scala> math.pow(2, -23).toFloat
res11: Float = 1.1920929E-7
scala> math.pow(2, -52)
res12: Double = 2.220446049250313E-16