IEEE 754-1985 [1] は、コンピュータで浮動小数点数を表現するための歴史的な業界標準であり、1985年に正式に採用され、2008年にIEEE 754-2008に置き換えられ、その後2019年にマイナーリビジョンのIEEE 754-2019に置き換えられました。[2] 23年間、浮動小数点計算で最も広く使用されていた形式でした。ソフトウェアでは浮動小数点ライブラリの形で、ハードウェアでは多くのCPUとFPUの命令で実装されました。IEEE 754-1985となるもののドラフトを実装した最初の集積回路は、Intel 8087でした。
IEEE 754-1985 は数値を2 進数で表し、4 つの精度レベルの定義を提供します。最もよく使用される 2 つは次のとおりです。
この標準では、正と負の無限大、"負のゼロ"、ゼロ除算などの無効な結果を処理するための 5 つの例外、それらの例外を表すNaNと呼ばれる特殊な値、上記よりも小さい数値を表す非正規数、および 4 つの丸めモードの表現も定義されています。
数字の表現


IEEE 754 形式の浮動小数点数は、符号ビット、バイアス指数、および小数の 3 つのフィールドで構成されます。次の例は、それぞれの意味を示しています。
10 進数 0.15625 10を2 進数で表すと 0.00101 2 (つまり、1/8 + 1/32) になります (下付き文字は基数 を示します)。科学的記数法と同様に、数値は小数点の左側に 1 つの非ゼロの数字を持つように記述されますが、この数値も「2 進小数点」の左側に 1 ビットを持つように書き直します。ビットを 3 桁左にシフトするのを補正するには、適切な 2 の累乗を掛けるだけです。
これで分数と指数を読み取ることができます。分数は .01 2で、指数は -3 です。
図に示すように、この数値の IEEE 754 表現の 3 つのフィールドは次のとおりです。
- 数値が正なので、符号は0 です。(1 は負を示します。)
- バイアス指数= -3 + 「バイアス」。単精度ではバイアスは127なので、この例ではバイアス指数は 124 です。倍精度ではバイアスは1023なので、この例ではバイアス指数は 1020 です。
- 分数= .01000… 2。
IEEE 754 では指数にバイアスが追加されているため、多くの場合、符号付き2 の補数整数を比較するのと同じハードウェアで数値を簡単に比較できます。バイアス指数を使用すると、2 つの正の浮動小数点数のうち小さい方が、符号と絶対値の整数と同じ順序に従って、大きい方より「小さく」なります。2 つの浮動小数点数の符号が異なる場合、符号と絶対値の比較はバイアス指数でも機能します。ただし、バイアス指数の浮動小数点数が両方とも負の場合、順序を逆にする必要があります。指数が 2 の補数などとして表される場合、2 つの数値のどちらが大きいかを比較するのはそれほど便利ではありません。
ゼロ以外のすべての数値は先頭の 1 で始まるため、先頭の 1 ビットは省略されます。先頭の 1 は暗黙的であり、実際に保存する必要がないため、「無料」の精度が 1 ビット追加されます。
ゼロ
数字のゼロは特別に表現されます:
非正規化数
上記の数値表現は正規化されていると呼ばれ、暗黙の先頭の 2 進数字が 1 であることを意味します。アンダーフローが発生したときの精度の低下を抑えるために、IEEE 754 には、暗黙の先頭の数字を 0 にすることで、正規化表現で可能なよりも小さい小数を表す機能が含まれています。このような数値は、非正規化数と呼ばれます。正規化数ほど多くの有効桁数は含まれませんが、演算結果が正確に 0 ではないが、正規化数で表すには 0 に近すぎる場合に、徐々に精度が失われます。
非正規数は、すべて0ビットのバイアス指数で表され、単精度では指数-126(-127ではない)、倍精度では指数-1022(-1023ではない)を表します。[3]対照的に、正規数を表す最小のバイアス指数は1です(以下の例を参照)。
非数値の表現
バイアス指数フィールドは、無限大または計算の無効な結果を示すために、すべて 1 ビットで埋められます。
正の無限大と負の無限大
正の無限大と負の無限大は次のように表されます。
- 符号= 正の無限大の場合は 0、負の無限大の場合は 1。
- バイアス指数= すべての 1 ビット。
- 小数部= すべて 0 ビット。
非N
浮動小数点演算の一部の演算は無効です。たとえば、負の数の平方根を取るなどです。無効な結果に達する動作は、浮動小数点例外と呼ばれます。例外的な結果は、NaN (「 Not a Number 」)と呼ばれる特別なコードで表されます。IEEE 754-1985 のすべての NaN は次の形式です。
- 符号= 0 または 1。
- バイアス指数= すべての 1 ビット。
- fraction = すべて 0 ビットを除く任意の値 (すべて 0 ビットは無限大を表すため)。
範囲と精度

精度は連続する2つの仮数表現間の最小差として定義されます。したがって、精度は仮数部のみの関数です。一方、ギャップは連続する2つの数値間の差として定義されます。[4]
単精度
単精度数は 32 ビットを占めます。単精度の場合:
- ゼロに最も近い正と負の数(指数部がすべて0で、小数部が2進数値1の非正規化値で表される)は、
- ±2 −23 × 2 −126 ≒ ±1.40130 × 10 −45
- ゼロに最も近い正と負の正規化された数(指数フィールドでは2進数値1、分数フィールドでは0で表される)は
- ±1 × 2 −126 ≒ ±1.17549 × 10 −38
- ゼロから最も遠い有限の正数と負数(指数部が254で分数部がすべて1である値で表される)は、
- ±(2−2 −23 ) × 2 127 [5] ≈ ±3.40282 × 1038
単精度で指定された指数の範囲とギャップ値の例をいくつか示します。
たとえば、16,777,217 は 16,777,216 に丸められるため、32 ビット浮動小数点数としてエンコードすることはできません。ただし、表現可能な範囲内の 2 の累乗であるすべての整数は、丸めずに 32 ビット浮動小数点数で保存できます。
倍精度
倍精度数は 64 ビットを占めます。倍精度では、
- ゼロに最も近い正と負の数(Expフィールドがすべて0で、Fractionフィールドが2進値1の非正規化値で表される)は、
- ±2 −52 × 2 −1022 ≒ ±4.94066 × 10 −324
- ゼロに最も近い正と負の正規化された数値(Expフィールドでは2進数値1、分数フィールドでは0で表される)は、
- ±1 × 2 −1022 ≒ ±2.22507 × 10 −308
- ゼロから最も遠い有限の正数と負数(Expフィールドが2046で分数フィールドがすべて1である値で表される)は、
- ±(2−2 −52 ) × 2 1023 [5] ≈ ±1.79769 × 10308
倍精度で指定された指数の範囲とギャップ値の例をいくつか示します。
拡張フォーマット
この標準では、丸め誤差を最小限に抑えるために、最終結果に必要な精度よりも高い精度で内部計算を実行するために拡張形式を使用することも推奨されています。この標準では、このような形式に対して最小精度と指数要件のみを指定しています。x87 80 ビット拡張形式は、これら の要件を満たす最も一般的に実装されている拡張形式です。
例
単精度 IEEE 754 表現の例をいくつか示します。
浮動小数点数の比較
すべての可能なビットの組み合わせは、NaN か、または関連する順序を持つアフィン拡張実数システムで一意の値を持つ数値のいずれかです。ただし、負のゼロと正のゼロの 2 つのビットの組み合わせは例外で、これらには特別な注意が必要な場合があります (以下を参照)。バイナリ表現には、NaN を除いて、任意の 2 つの数値を符号と絶対値の整数として比較できるという特別な特性があります (エンディアンの問題が適用されます)。2の補数の整数として比較する場合: 符号ビットが異なる場合は、負の数が正の数に先行するため、2 の補数で正しい結果が得られます (ただし、負のゼロと正のゼロは等しいと見なされます)。両方の値が正の場合、2 の補数の比較でも正しい結果が得られます。それ以外の場合 (2 つの負の数)、正しい FP 順序は、2 の補数順序の逆になります。
浮動小数点計算に固有の丸め誤差により、結果の正確な等価性をチェックするための比較の使用が制限される場合があります。許容範囲の選択は複雑なトピックです。一般的な手法は、比較イプシロン値を使用して近似比較を実行することです。[6] 比較の寛容さに応じて、一般的な値には単精度の場合はまたは、1e-6倍精度の場合はが含まれます。[7] [8] もう1つの一般的な手法はULPです。これは、最後の桁の差をチェックし、2つの値が何ステップ離れているかを効果的にチェックします。[9]1e-51e-14
負のゼロと正のゼロは比較の目的では一般に等しいとみなされますが、プログラミング言語の 関係演算子や同様の構造の中には、それらを異なるものとして扱うものもあります。Java言語仕様[10]によれば、比較演算子と等価演算子はそれらを等しいものとして扱いますが、と はそれらを区別します(正式にはJavaバージョン1.1から開始されていますが、実際には1.1.1から)。クラスとの比較メソッド、さらにはでも同様です。
Math.min()Math.max()equals()compareTo()compare()FloatDouble
浮動小数点数の丸め
IEEE 標準には 4 つの異なる丸めモードがあります。最初のモードはデフォルトで、その他は方向付き丸めと呼ばれます。
- 最も近い値に丸める– 最も近い値に丸めます。数値が中間値に収まる場合は、偶数 (ゼロ) の最下位ビットを持つ最も近い値に丸められます。つまり、50% の確率で切り上げられます ( IEEE 754-2008では、このモードは、他の最も近い値に丸めるモードと区別するためにroundTiesToEvenと呼ばれます)。
- 0 への丸め– 0 への丸め
- +∞ 方向への丸め– 正の無限大方向への丸め
- −∞ 方向に丸める– 負の無限大方向への丸め。
実数の拡張
IEEE 標準では、正の無限大と負の無限大を別々に持つアフィン拡張実数システムを採用 (および拡張) しています。草案作成中、プログラマーにモード選択オプションを提供することで、単一の符号なし無限大を持つ射影拡張実数システムを標準に組み込むという提案がありました。しかし、最終的な標準の複雑さを軽減するために、射影モードは削除されました。Intel 8087およびIntel 80287浮動小数点コプロセッサーはどちらもこの射影モードをサポートしています。[11] [12] [13]
関数と述語
標準操作
以下の機能を提供する必要があります。
- 足す、引く、掛ける、割る
- 平方根
- 浮動小数点剰余。これは通常のモジュロ演算とは異なり、2 つの正の数に対して負の値になることがあります。x– (round(x/y)·y)の正確な値を返します。
- 最も近い整数に丸めます。2 つの整数の中間にある場合の無向丸めでは、偶数の整数が選択されます。
- 比較演算。より明白な結果の他に、IEEE 754 では、任意のx (を含む)に対して、 −∞ = −∞、+∞ = +∞、 x ≠ と定義されています。
NaNNaN
推奨される関数と述語
copysign(x,y)は y の符号を付けた x を返すので、 とabs(x)等しくなりますcopysign(x,1.0)。これは、算術演算に似た方法で NaN を操作する数少ない操作の 1 つです。この関数はcopysignC99 標準で新しく追加されました。- −x は符号を反転した x を返します。これは、x が 0 の場合など、場合によっては 0−x とは異なります。したがって、−(0) は −0 ですが、0−0 の符号は丸めモードによって異なります。
scalb(y, N)logb(x)finite(x)「xは有限値である」という述語。 -Inf < x < Infと同等isnan(x)「x は NaN である」という述語は、「x ≠ x」と同等であるx <> yこれは、NaN のため NOT(x = y) とは異なる動作をすることがわかります。unordered(x, y)「x が y と順序付けられていない」場合、つまり x または y のいずれかが NaN の場合に true になります。class(x)nextafter(x,y)xからy方向への次の表現可能な値を返します。
歴史
1976年、インテルは浮動小数点コプロセッサの開発を開始した。 [ 14] [15]インテルは、多種多様な数学ソフトウェアライブラリに含まれるすべての演算を適切に実装したチップを販売できると期待していた。[14] [16]
プロジェクトを統括したジョン・パーマーは、異なるプロセッサ間で浮動小数点演算を統一する標準によってこの取り組みを支えるべきだと信じていた。パーマーは、ヒューレット・パッカードの計算機の精度向上に貢献したカリフォルニア大学のウィリアム・カーハンに連絡を取った。カーハンは、インテルがデジタル・イクイップメント・コーポレーション(DEC)のVAXの浮動小数点演算を使用することを提案した。最初のVAXであるVAX-11/780は1977年後半に発売されたばかりで、その浮動小数点演算は高く評価されていた。しかし、インテルは自社のチップをできるだけ広い市場に売り込もうと、できるだけ優れた浮動小数点演算を求め、カーハンは仕様を作成した。[14]カーハンは当初、浮動小数点の基数を10進数にすることを推奨したが[17] [信頼できない情報源? ]、コプロセッサのハードウェア設計があまりにも進んでいたため、その変更を行うことができなかった。
インテル内の作業は他のベンダーを不安にさせ、彼らは「公平な競争の場」を確保するために標準化の取り組みを始めた。カハンは1977年11月に開催された第2回IEEE 754標準ワーキンググループ会議に出席した。その後、彼はインテルから、コプロセッサに関する自身の作業に基づいた草案提案を提出する許可を得た。彼はフォーマットの詳細とその根拠を説明することは許されたが、インテルの実装アーキテクチャに関連することは何も説明できなかった。草案はジェローム・クーネンとハロルド・ストーンと共同執筆され、当初は「カハン・クーネン・ストーン提案」または「KCSフォーマット」と呼ばれていた。[14] [15] [16] [18]
8ビットの指数部は、例えば2つの32ビット数の積を格納するなど、倍精度数に求められるいくつかの演算には幅が足りなかったため、[19] Kahanの提案とDECの反対提案は両方とも、 1965年のCDC 6600の実績ある60ビット浮動小数点形式のような11ビットを使用した。 [15] [18] [20] Kahanの提案では、ゼロ除算条件を扱うときに便利な無限大、無効な演算を扱うときに便利な非数値、アンダーフローによって引き起こされる問題を軽減するのに役立つ非正規数、 [18] [21] [22]および、数値の逆数を取るときにオーバーフローとアンダーフローを回避するのに役立つ、よりバランスのとれた指数バイアスも提供された。 [23] [24]
承認される前から、この標準草案は多くのメーカーによって実装されていました。[25] [26] 1980年に発表されたIntel 8087は、この標準草案を実装した最初のチップでした。

1980年にはIntel 8087チップがすでに発売されていましたが[27]、DECはパフォーマンス上の懸念と、DECのフォーマットを標準化することでDECに競争上の優位性を与えることから、特に非正規化数に対して反対し続けました。
段階的アンダーフローをめぐる議論は、 1981年にDECが評価のために雇った専門家が反対派に反対するまで続いた。DECは段階的アンダーフローは悪い考えだと示すために調査を行ったが、調査の結果は正反対だったため、DECは屈服した。1985年にこの規格は承認されたが、すでに1年前には多くのメーカーが実装し、事実上の標準となっていた。[15] [18] [5]
参照
- IEEE754 規格
- IEEE 754 浮動小数点数の特性の簡単な例であるMinifloat
- 固定小数点演算
注記
- ^ 精度: 小数点以下の桁数は、number_of_mantissa_bits * Log 10 (2) で計算されます。したがって、単精度と倍精度の場合はそれぞれ約 7.2 と約 15.9 になります。
参考文献
- ^ IEEE バイナリ浮動小数点演算標準。1985 年。doi :10.1109 / IEEESTD.1985.82928。ISBN 0-7381-1165-1。
- ^ 「ANSI/IEEE Std 754-2019」。754r.ucbtest.org 。 2019年8月6日閲覧。
- ^ ヘネシー (2009).コンピュータの構成と設計. モーガン・カウフマン. p. 270. ISBN 9780123744937。
- ^ Hossam AH Fahmy、Shlomo Waser、Michael J. Flynn、「Computer Arithmetic (PDF) 」 、 2010年10月8日にオリジナル(PDF)からアーカイブ、2011年1月2日に取得
- ^ abc William Kahan (1997 年 10 月 1 日)。「IEEE 754 の現状に関する講義ノート」(PDF)。カリフォルニア大学バークレー校。2007年 4 月 12 日閲覧。
- ^ “Godot math_funcs.h”. GitHub.com . 2022年7月30日.
- ^ “Godot math_defs.h”. GitHub.com . 2022年7月30日.
- ^ 「Godot MathfEx.cs」。GitHub.com。
- ^ 「浮動小数点数の比較、2012年版」randomascii.wordpress.com。2012年2月26日。
- ^ 「Java 言語および仮想マシンの仕様」。Javaドキュメント。
- ^ John R. Hauser (1996 年 3 月). 「数値プログラムにおける浮動小数点例外の処理」(PDF) . ACM Transactions on Programming Languages and Systems . 18 (2): 139–174. doi : 10.1145/227699.227701 . S2CID 9820157.
- ^ David Stevenson (1981 年 3 月)。「IEEE タスク P754: 2 進浮動小数点演算の標準提案」IEEE Computer . 14 (3): 51–62. doi :10.1109/CM.1981.220377. S2CID 15523399。
- ^ William Kahan および John Palmer (1979)。「提案され た浮動小数点標準について」。SIGNUM ニュースレター。14 (特別): 13–21。doi : 10.1145 /1057520.1057522。S2CID 16981715 。
- ^ abcd 「Intel と浮動小数点 - 業界で最も成功した標準の 1 つを更新 - 浮動小数点標準のテクノロジ ビジョン」(PDF)。Intel。2016年。2016 年 3 月 4 日のオリジナル(PDF)からアーカイブ。2016 年 5 月 30日閲覧。(11ページ)
- ^ abcd 「An Interview with the Old Man of Floating-Point」. cs.berkeley.edu. 1998-02-20 . 2016-05-30閲覧。
- ^ ab Woehr, Jack編 (1997-11-01). 「ウィリアム・カーハンとの会話」Dr. Dobb's . drdobbs.com . 2016-05-30閲覧。
- ^ W. Kahan 2003、 IEEE 754会議後のMike Cowlishawらへの個人的な通信
- ^ abcd 「IEEE 754: William Kahan 氏へのインタビュー」(PDF) . dr-chuck.com . 2016 年 6 月 2 日閲覧。
- ^ 「IEEE vs. Microsoft バイナリ形式; 丸めの問題 (完全版)」。Microsoft サポート。Microsoft。2006年 11 月 21 日。記事 ID KB35826、Q35826。2020 年 8 月 28 日時点のオリジナルからアーカイブ。2010年 2 月 24 日取得。
- ^ Thornton, James E. (1970). Control Data Corporation の Advanced Design Laboratory で執筆。Design of a Computer: The Control Data 6600 (PDF) (1 版). Glenview, Illinois, USA: Scott, Foresman and Company . LCCN 74-96462. 2020-08-28 にオリジナルからアーカイブ(PDF)されました。2016-06-02に取得。(1+13+181+2+2ページ)
- ^ Kahan, William Morton . 「なぜ浮動小数点演算標準が必要なのか?」(PDF) cs.berkeley.edu . 2016年6月2日閲覧。
- ^ Kahan, William Morton ; Darcy, Joseph D. 「How Java's Floating-Point Hurts Everyone Everywhere」(PDF) . cs.berkeley.edu . 2016-06-02に閲覧。
- ^ Turner, Peter R. (2013-12-21). 数値解析と並列処理: ランカスター大学での講義…. Springer. ISBN 978-3-66239812-8. 2016年5月30日閲覧。
- ^ 「標準化された浮動小数点形式の名前」(PDF) . cs.berkeley.edu . 2016年6月2日閲覧。
- ^ Charles Severance (1998 年 2 月 20 日)。「浮動小数点の老師とのインタビュー」
- ^ Charles Severance . 「IEEE 浮動小数点形式の歴史」。Connexions。2009 年 11 月 20 日時点のオリジナルよりアーカイブ。
- ^ 「分子表現:科学、光学、そしてあなた - オリンパス MIC-D:集積回路ギャラリー - Intel 8087 数学コプロセッサ」。micro.magnet.fsu.edu 。2016年 5 月 30 日閲覧。
さらに読む
- Charles Severance ( 1998 年 3 月)。「IEEE 754: William Kahan とのインタビュー」(PDF)。IEEE Computer。31 (3 ) : 114–115。doi :10.1109/MC.1998.660194。S2CID 33291145。2009年 8 月 23 日に オリジナル(PDF)からアーカイブ。2008年 4 月 28 日に取得。
- David Goldberg (1991 年3月)。「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」(PDF)。ACM Computing Surveys。23 ( 1): 5–48。doi : 10.1145 /103162.103163。S2CID 222008826。2008年 4 月 28 日閲覧。
- Chris Hecker (1996 年 2 月)。「Let's Get To The (Floating) Point」(PDF)。Game Developer Magazine : 19–24。ISSN 1073-922X。2007年 2 月 3 日の オリジナル(PDF)からアーカイブ。
- David Monniaux (2008年5 月)。「浮動小数点計算の検証の落とし穴」。ACM Transactions on Programming Languages and Systems。30 ( 3 ): 1–41。arXiv : cs/0701192。doi : 10.1145 / 1353445.1353446。ISSN 0164-0925。S2CID 218578808 。: 一般的なアーキテクチャにおける浮動小数点の直感的でない動作の概要と、プログラムの検証とテストへの影響。
外部リンク
- フロートの比較
- Coprocessor.info: x87 FPU の写真、開発、製造元情報
- IEEE 854-1987 — 歴史と議事録
- IEEE754 (単精度および倍精度) オンライン コンバータ
