計算機イプシロン(けいさんきイプシロン、)は、浮動小数点数において、「1より大きい最小の数」と1との差のことである。機械イプシロン(きかいイプシロン)とも言う。また、それぞれの「イプシロン」はエプシロンとも表記される。

概要 コンピュータで扱われる浮動小数点数は、指数部と仮数部に分かれており、単に小さい数を表すだけであれば指数部を小さくすれば表現が可能である。一方、「1より大きい最小の数」のような場合は、仮数部を使って微小な差を表現することとなる。その限界が計算機イプシロンである。

進法で仮数部 桁の浮動小数点数の場合、計算機イプシロンはとなる。 例えば、IEEE 754のbinary32(単精度)では、、なので、となる。 同様にIEEE 754のbinary64(倍精度)ではとなり、binary128(四倍精度)ではとなる。一部の環境では拡張倍精度浮動小数点数がサポートされており、80ビット実装の場合はとなる。

定義の混乱 元来の定義では上述のとおりとなっているが、一部では「 となる最小の 」という定義、あるいは説明をしている例が存在するData Type Constants | Microsoft Docs。後者の定義では、浮動小数点演算の丸め処理の定義に依存して値が変化してしまうため、厳密には同じでない。

.NET Microsoftの.NET Frameworkおよび.NETの基本クラスライブラリに、System.Double.Epsilonという定数フィールドが定義されているDouble.Epsilon Field (System) | Microsoft Learnが、これは浮動小数点方式で表現可能な最小の正の非正規化数であり、計算機イプシロンではない。System.Single.Epsilonも同様であるSingle.Epsilon Field (System) | Microsoft Learn。これらはC11/C++17のDBL_TRUE_MINやFLT_TRUE_MINに相当するNumeric limits - cppreference.comC numeric limits interface - cppreference.com。

歴史的に、「epsilon」は異なる言語において様々な概念を指す用語として使われており、混乱やバグを誘発しやすいProtocol FloatingPoint, Type Property ulpOfOne | Apple Developer Documentation。

各プログラミング言語での対応 C言語 C言語においては、<float.h>でFLT_EPSILON、DBL_EPSILON、LDBL_EPSILONというマクロ定数が定義されており、それぞれfloat型、double型、long double型の計算機イプシロンの値となっている。

C++ C++ではテンプレートを利用したstd::numeric_limits<T>::epsilon()関数が定義されているstd::numeric_limits<T>::epsilon - cppreference.com。返却される値は前述のC言語の定数と同値である。

Python PythonではCのDBL_EPSILONに準ずる値がsys.float_info.epsilonとして定義されているsys — System-specific parameters and functions — Python 3.10 documentation。

JavaScript JavaScriptではNumber.EPSILONが定義されているNumber.EPSILON - JavaScript | MDN。

Julia Julia は標準で計算機イプシロンを取得する関数があり eps(Float32) のように使用する。

Swift SwiftではFloatingPointプロトコル(抽象型)に型プロパティulpOfOneが定義されている。CのFLT_EPSILON、DBL_EPSILON、LDBL_EPSILONに相当する実装は、それぞれFloat.ulpOfOne、Double.ulpOfOne、Float80.ulpOfOneであるStructure Float, Type Property ulpOfOne | Apple Developer DocumentationStructure Double, Type Property ulpOfOne | Apple Developer DocumentationStructure Float80, Type Property ulpOfOne | Apple Developer Documentation。ただしFloat80はIntel (x86) プロセッサ環境でのみ利用可能であり、Appleシリコン(ARMアーキテクチャ)では利用できないFloat80 | Apple Developer Documentation。

脚注 注釈

出典

関連項目 誤差