計算機イプシロンのソースを表示
←
計算機イプシロン
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''計算機イプシロン'''(けいさんきイプシロン、{{lang-en-short|machine epsilon}})は、[[浮動小数点数]]において、「1より大きい最小の数」と1との差のことである<ref name="algo">{{cite book | 1=和書 | title=C言語による最新アルゴリズム事典 | publisher=[[技術評論社]] | author=奥村晴彦 | authorlink=奥村晴彦 | year=1991 | page=33| isbn=4-87408-414-1}}</ref>。'''機械イプシロン'''(きかいイプシロン)とも言う。また、それぞれの「イプシロン」は'''エプシロン'''とも表記される{{efn|ギリシャ文字[[ε]]の本来の発音により近いのは「エプシロン」のほうである<ref>[https://eow.alc.co.jp/search?q=epsilon epsilonの意味・使い方・読み方|英辞郎 on the WEB]</ref>。}}。 == 概要 == コンピュータで扱われる浮動小数点数は、指数部と[[仮数]]部に分かれており、単に小さい数を表すだけであれば指数部を小さくすれば表現が可能である。一方、「1より大きい最小の数」のような場合は、仮数部を使って微小な差を表現することとなる。その限界が計算機イプシロンである。 <math>b</math> 進法で仮数部 <math>p</math> 桁の浮動小数点数の場合、計算機イプシロンは<math>b^{1-p}</math>となる<ref name="algo" />。 例えば、[[IEEE 754]]のbinary32([[単精度浮動小数点数|単精度]])では、<math>b = 2</math>、<math>p = 24</math>{{efn|データとしては23桁であるが、正規化数では先頭に1が補われ、24桁の値となる。}}なので、<math>\epsilon=2^{1-24}=1.192\times10^{-7}</math>となる。 同様にIEEE 754のbinary64([[倍精度浮動小数点数|倍精度]])では<math>\epsilon=2^{1-53}=2.220\times10^{-16}</math>となり、binary128([[四倍精度浮動小数点数|四倍精度]])では<math>\epsilon=2^{1-113}=1.926\times10^{-34}</math>となる。一部の環境では[[拡張倍精度浮動小数点数]]がサポートされており、80ビット実装の場合は<math>\epsilon=2^{1-64}=1.084\times10^{-19}</math>となる。 == 定義の混乱 == 元来の定義では上述のとおりとなっているが、一部では「<math>1+x \neq 1</math> となる最小の <math>x</math>」という定義、あるいは説明をしている例が存在する<ref>[https://docs.microsoft.com/en-us/cpp/c-runtime-library/data-type-constants Data Type Constants | Microsoft Docs]</ref>。後者の定義では、浮動小数点演算の[[丸め]]処理の定義に依存して値が変化してしまう<ref name="algo" />ため、厳密には同じでない。 === .NET === Microsoftの[[.NET Framework]]および[[.NET]]の[[基本クラスライブラリ]]に、<code>System.Double.Epsilon</code>という定数[[フィールド (計算機科学)|フィールド]]が定義されている<ref>[https://learn.microsoft.com/en-us/dotnet/api/system.double.epsilon Double.Epsilon Field (System) | Microsoft Learn]</ref>が、これは浮動小数点方式で表現可能な最小の正の[[非正規化数]]であり、'''計算機イプシロンではない'''<ref>{{Cite web|url=https://learn.microsoft.com/en-us/dotnet/fundamentals/runtime-libraries/system-double-epsilon |title=System.Double.Epsilon property - .NET|website=Microsoft Learn|quote=The value of the Epsilon property is not equivalent to machine epsilon, ...|accessdate=2024-06-16}}</ref>。<code>System.Single.Epsilon</code>も同様である<ref>[https://learn.microsoft.com/en-us/dotnet/api/system.single.epsilon Single.Epsilon Field (System) | Microsoft Learn]</ref>。これらは[[C11 (C言語)|C11]]/[[C++17]]の<code>DBL_TRUE_MIN</code>や<code>FLT_TRUE_MIN</code>に相当する<ref>[https://en.cppreference.com/w/c/types/limits Numeric limits - cppreference.com]</ref><ref>[https://en.cppreference.com/w/cpp/types/climits C numeric limits interface - cppreference.com]</ref>。 歴史的に、「epsilon」は異なる言語において様々な概念を指す用語として使われており、混乱やバグを誘発しやすい<ref name="FloatingPoint.ulpOfOne">[https://developer.apple.com/documentation/swift/floatingpoint/ulpofone-7hdlb Protocol FloatingPoint, Type Property ulpOfOne | Apple Developer Documentation]</ref>。 == 各プログラミング言語での対応 == === C言語 === [[C言語]]においては、<code><float.h></code>で<code>'''FLT_EPSILON'''</code>、<code>'''DBL_EPSILON'''</code>、<code>'''LDBL_EPSILON'''</code>というマクロ定数が定義されており、それぞれ<code>float</code>型、<code>double</code>型、<code>long double</code>型の計算機イプシロンの値となっている<ref name="algo" />。 === C++ === [[C++]]では[[テンプレート (プログラミング)|テンプレート]]を利用した<code>std::numeric_limits<T>::epsilon()</code>関数が定義されている<ref>[https://ja.cppreference.com/w/cpp/types/numeric_limits/epsilon std::numeric_limits<T>::epsilon - cppreference.com]</ref>。返却される値は前述のC言語の定数と同値である。 === Python === [[Python]]ではCの<code>DBL_EPSILON</code>に準ずる値が<code>sys.float_info.epsilon</code>として定義されている<ref>[https://docs.python.org/3.10/library/sys.html#sys.float_info sys — System-specific parameters and functions — Python 3.10 documentation]</ref>。 === JavaScript === [[JavaScript]]では<code>Number.EPSILON</code>が定義されている<ref>[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON Number.EPSILON - JavaScript | MDN]</ref>。 === Julia === [[Julia (プログラミング言語)|Julia]] は標準で計算機イプシロンを取得する関数があり <code>eps(Float32)</code> のように使用する。 === Swift === [[Swift (プログラミング言語)|Swift]]では<code>FloatingPoint</code>プロトコル(抽象型)に型プロパティ<code>ulpOfOne</code>が定義されている<ref name="FloatingPoint.ulpOfOne"/>。Cの<code>FLT_EPSILON</code>、<code>DBL_EPSILON</code>、<code>LDBL_EPSILON</code>に相当する実装は、それぞれ<code>Float.ulpOfOne</code>、<code>Double.ulpOfOne</code>、<code>Float80.ulpOfOne</code>である<ref>[https://developer.apple.com/documentation/swift/float/ulpofone-18riz Structure Float, Type Property ulpOfOne | Apple Developer Documentation]</ref><ref>[https://developer.apple.com/documentation/swift/double/ulpofone-5gc7y Structure Double, Type Property ulpOfOne | Apple Developer Documentation]</ref><ref>[https://developer.apple.com/documentation/swift/float80/ulpofone-656b5 Structure Float80, Type Property ulpOfOne | Apple Developer Documentation]</ref>。ただし<code>Float80</code>はIntel ([[x86]]) プロセッサ環境でのみ利用可能であり、[[Appleシリコン]]([[ARMアーキテクチャ]])では利用できない<ref>[https://developer.apple.com/documentation/swift/float80 Float80 | Apple Developer Documentation]</ref>。 == 脚注 == === 注釈 === {{notelist}} === 出典 === {{reflist}} == 関連項目 == *[[誤差]] {{computer-stub}} {{DEFAULTSORT:けいさんきいふしろん}} [[Category:コンピュータの算術]] [[Category:数学に関する記事]]
このページで使用されているテンプレート:
テンプレート:Cite book
(
ソースを閲覧
)
テンプレート:Cite web
(
ソースを閲覧
)
テンプレート:Computer-stub
(
ソースを閲覧
)
テンプレート:Efn
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Notelist
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
計算機イプシロン
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報