計算機イプシロン
計算機イプシロン(けいさんきイプシロン、英: machine epsilon)は、浮動小数点数において、「1より大きい最小の数」と1との差のことである[1]。機械イプシロン(きかいイプシロン)とも言う。また、それぞれの「イプシロン」はエプシロンとも表記される[注釈 1]。
概要
[編集]コンピュータで扱われる浮動小数点数は、指数部と仮数部に分かれており、単に小さい数を表すだけであれば指数部を小さくすれば表現が可能である。一方、「1より大きい最小の数」のような場合は、仮数部を使って微小な差を表現することとなる。その限界が計算機イプシロンである。
進法で仮数部 桁の浮動小数点数の場合、計算機イプシロンはとなる[1]。 例えば、IEEE 754のbinary32(単精度)では、、[注釈 2]なので、となる。 同様にIEEE 754のbinary64(倍精度)ではとなり、binary128(四倍精度)ではとなる。一部の環境では拡張倍精度浮動小数点数がサポートされており、80ビット実装の場合はとなる。
定義の混乱
[編集]元来の定義では上述のとおりとなっているが、一部では「 となる最小の 」という定義、あるいは説明をしている例が存在する[3]。後者の定義では、浮動小数点演算の丸め処理の定義に依存して値が変化してしまう[1]ため、厳密には同じでない。
.NET
[編集]Microsoftの.NET Frameworkおよび.NETの基本クラスライブラリに、System.Double.Epsilon
という定数フィールドが定義されている[4]が、これは浮動小数点方式で表現可能な最小の正の非正規化数であり、計算機イプシロンではない[5]。System.Single.Epsilon
も同様である[6]。これらはC11/C++17のDBL_TRUE_MIN
やFLT_TRUE_MIN
に相当する[7][8]。
歴史的に、「epsilon」は異なる言語において様々な概念を指す用語として使われており、混乱やバグを誘発しやすい[9]。
各プログラミング言語での対応
[編集]C言語
[編集]C言語においては、<float.h>
でFLT_EPSILON
、DBL_EPSILON
、LDBL_EPSILON
というマクロ定数が定義されており、それぞれfloat
型、double
型、long double
型の計算機イプシロンの値となっている[1]。
C++
[編集]C++ではテンプレートを利用したstd::numeric_limits<T>::epsilon()
関数が定義されている[10]。返却される値は前述のC言語の定数と同値である。
Python
[編集]PythonではCのDBL_EPSILON
に準ずる値がsys.float_info.epsilon
として定義されている[11]。
JavaScript
[編集]JavaScriptではNumber.EPSILON
が定義されている[12]。
Julia
[編集]Julia は標準で計算機イプシロンを取得する関数があり eps(Float32)
のように使用する。
Swift
[編集]SwiftではFloatingPoint
プロトコル(抽象型)に型プロパティulpOfOne
が定義されている[9]。CのFLT_EPSILON
、DBL_EPSILON
、LDBL_EPSILON
に相当する実装は、それぞれFloat.ulpOfOne
、Double.ulpOfOne
、Float80.ulpOfOne
である[13][14][15]。ただしFloat80
はIntel (x86) プロセッサ環境でのみ利用可能であり、Appleシリコン(ARMアーキテクチャ)では利用できない[16]。
脚注
[編集]注釈
[編集]出典
[編集]- ^ a b c d 奥村晴彦『C言語による最新アルゴリズム事典』技術評論社、1991年、33頁。ISBN 4-87408-414-1。
- ^ epsilonの意味・使い方・読み方|英辞郎 on the WEB
- ^ Data Type Constants | Microsoft Docs
- ^ Double.Epsilon Field (System) | Microsoft Learn
- ^ “System.Double.Epsilon property - .NET”. Microsoft Learn. 2024年6月16日閲覧。 “The value of the Epsilon property is not equivalent to machine epsilon, ...”
- ^ Single.Epsilon Field (System) | Microsoft Learn
- ^ Numeric limits - cppreference.com
- ^ C numeric limits interface - cppreference.com
- ^ a b Protocol FloatingPoint, Type Property ulpOfOne | Apple Developer Documentation
- ^ std::numeric_limits<T>::epsilon - cppreference.com
- ^ sys — System-specific parameters and functions — Python 3.10 documentation
- ^ Number.EPSILON - JavaScript | MDN
- ^ Structure Float, Type Property ulpOfOne | Apple Developer Documentation
- ^ Structure Double, Type Property ulpOfOne | Apple Developer Documentation
- ^ Structure Float80, Type Property ulpOfOne | Apple Developer Documentation
- ^ Float80 | Apple Developer Documentation