計算機イプシロン

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

概要

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

b {\displaystyle b} 進法で仮数部 p {\displaystyle p} 桁の浮動小数点数の場合、計算機イプシロンは b 1 p {\displaystyle b^{1-p}} となる[1]。 例えば、IEEE 754のbinary32(単精度)では、 b = 2 {\displaystyle b=2} p = 24 {\displaystyle p=24} [注釈 2]なので、 ϵ = 2 1 24 = 1.192 × 10 7 {\displaystyle \epsilon =2^{1-24}=1.192\times 10^{-7}} となる。 同様にIEEE 754のbinary64(倍精度)では ϵ = 2 1 53 = 2.220 × 10 16 {\displaystyle \epsilon =2^{1-53}=2.220\times 10^{-16}} となり、binary128(四倍精度)では ϵ = 2 1 113 = 1.926 × 10 34 {\displaystyle \epsilon =2^{1-113}=1.926\times 10^{-34}} となる。一部の環境では拡張倍精度浮動小数点数がサポートされており、80ビット実装の場合は ϵ = 2 1 64 = 1.084 × 10 19 {\displaystyle \epsilon =2^{1-64}=1.084\times 10^{-19}} となる。

定義の混乱

元来の定義では上述のとおりとなっているが、一部では「 1 + x 1 {\displaystyle 1+x\neq 1} となる最小の x {\displaystyle x} 」という定義、あるいは説明をしている例が存在する[3]。後者の定義では、浮動小数点演算の丸め処理の定義に依存して値が変化してしまう[1]ため、厳密には同じでない。

.NET

Microsoftの.NET Frameworkおよび.NET基本クラスライブラリに、System.Double.Epsilonという定数フィールドが定義されている[4]が、これは浮動小数点方式で表現可能な最小の正の非正規化数であり、計算機イプシロンではない[5]System.Single.Epsilonも同様である[6]。これらはC11/C++17DBL_TRUE_MINFLT_TRUE_MINに相当する[7][8]

歴史的に、「epsilon」は異なる言語において様々な概念を指す用語として使われており、混乱やバグを誘発しやすい[9]

各プログラミング言語での対応

C言語

C言語においては、<float.h>FLT_EPSILONDBL_EPSILONLDBL_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_EPSILONDBL_EPSILONLDBL_EPSILONに相当する実装は、それぞれFloat.ulpOfOneDouble.ulpOfOneFloat80.ulpOfOneである[13][14][15]。ただしFloat80はIntel (x86) プロセッサ環境でのみ利用可能であり、AppleシリコンARMアーキテクチャ)では利用できない[16]

脚注

注釈

  1. ^ ギリシャ文字εの本来の発音により近いのは「エプシロン」のほうである[2]
  2. ^ データとしては23桁であるが、正規化数では先頭に1が補われ、24桁の値となる。

出典

  1. ^ a b c d 奥村晴彦『C言語による最新アルゴリズム事典』技術評論社、1991年、33頁。ISBN 4-87408-414-1。 
  2. ^ epsilonの意味・使い方・読み方|英辞郎 on the WEB
  3. ^ Data Type Constants | Microsoft Docs
  4. ^ Double.Epsilon Field (System) | Microsoft Learn
  5. ^ “System.Double.Epsilon property - .NET”. Microsoft Learn. 2024年6月16日閲覧。 “The value of the Epsilon property is not equivalent to machine epsilon, ...”
  6. ^ Single.Epsilon Field (System) | Microsoft Learn
  7. ^ Numeric limits - cppreference.com
  8. ^ C numeric limits interface - cppreference.com
  9. ^ a b Protocol FloatingPoint, Type Property ulpOfOne | Apple Developer Documentation
  10. ^ std::numeric_limits<T>::epsilon - cppreference.com
  11. ^ sys — System-specific parameters and functions — Python 3.10 documentation
  12. ^ Number.EPSILON - JavaScript | MDN
  13. ^ Structure Float, Type Property ulpOfOne | Apple Developer Documentation
  14. ^ Structure Double, Type Property ulpOfOne | Apple Developer Documentation
  15. ^ Structure Float80, Type Property ulpOfOne | Apple Developer Documentation
  16. ^ Float80 | Apple Developer Documentation

関連項目

  • 表示
  • 編集