| 浮動小数点形式 |
|---|
| IEEE 754 |
| 他の |
| 代替案 |
| テーパード浮動小数点 |
IEEE浮動小数点演算標準(IEEE 754)は、1985年に米国電気電子学会(IEEE)によって制定された浮動小数点演算 の技術標準です。この標準は、多様な浮動小数点実装において、信頼性と移植性を確保しながら使用することを困難にしていた多くの問題に対処しました。多くのハードウェア浮動小数点ユニットはIEEE 754標準を採用しています。
この標準では以下が定義されています。
2008 年 8 月に発行されたIEEE 754-2008には、元のIEEE 754-1985標準のほぼすべてに加えて、IEEE 854-1987 (基数非依存浮動小数点演算) 標準が含まれています。現在のバージョンであるIEEE 754-2019は、2019年7月に発行されました。[ 1 ]これは以前のバージョンのマイナーリビジョンであり、主に明確化、欠陥の修正、および新しい推奨操作が組み込まれています。
| 年 | 公式規格 |
|---|---|
| 1982 | IEC 559:1982 |
| 1985 | IEEE 754-1985 |
| 1987 | IEEE 854-1987 |
| 1989 | IEC 559:1989 |
| 2008 | IEEE 754-2008 |
| 2011 | ISO/IEC/IEEE 60559:2011 |
| 2019 | IEEE 754-2019 |
| 2020 | ISO/IEC 60559:2020 |
| 2029 | 未定 |
浮動小数点標準の必要性は、1960年代から1970年代にかけてのビジネスおよび科学計算業界の混乱から生まれました。IBMは、精度に関わらず常に7ビットを指数として使用する16進浮動小数点形式を採用していました。CDCおよびCrayコンピュータは、 +0と-0の値を許容する1の補数表現を使用していました。CDCの60ビットコンピュータには完全な60ビット加算器が搭載されていなかったため、整数演算は浮動小数点ユニットからの48ビット精度に制限されていました。ゼロ除算による例外処理はコンピュータごとに異なり、システム間でデータを移動することや、同じ計算を異なるシステムで繰り返すことさえ困難になることがよくありました。
浮動小数点演算に関する最初の IEEE 標準であるIEEE 754-1985 は、1985 年に発行されました。この標準では、2 進浮動小数点演算のみが対象とされていました。
7年間にわたる改訂作業を経て、Dan Zuras氏が議長を務め、Mike Cowlishaw氏が編集した新しいバージョンであるIEEE 754-2008が2008年8月に発行されました。この規格は、IEEE 754-1985(2進浮動小数点演算)およびIEEE 854-1987(基数非依存浮動小数点演算)の両方の規格に取って代わりました。この新しい規格には、元の規格の2進形式に加えて、2進形式1つと10進形式2つの計3つの新しい基本形式が含まれています。現在の規格に準拠するには、実装において、少なくとも1つの基本形式を算術形式と交換形式の両方として実装する必要があります。
国際規格ISO/IEC/IEEE 60559:2011 (IEEE 754-2008と同一の内容)は、ISO/IEEE PSDO協定[ 2 ] [ 3 ]に基づき、 ISO / IEC JTC 1 /SC 25を通じて採用が承認され、発行されました。[ 4 ]
2019年7月に発行された現行版IEEE 754-2019は、2015年9月に開始された改訂プロセス(議長:David G. Hough、編集者:Mike Cowlishaw)を経て、IEEE 754-2008から派生し、これを置き換えるものです。この改訂プロセスでは、主に明確化(例:totalOrder)と不具合修正(例:minNum)が行われていますが、新たに推奨される演算(例:augmentedAddition)もいくつか含まれています。[ 5 ] [ 6 ]
国際規格ISO/IEC 60559:2020(IEEE 754-2019と同一の内容)は、ISO/IEC JTC 1 /SC 25を通じて採用が承認され、発行されました。[ 7 ]
この規格の次回の改訂は2029年に予定されている。[ 8 ]
IEEE 754形式は「数値と記号の表現の集合」です。形式には、その集合がどのようにエンコードされるかが含まれる場合もあります。[ 9 ]
浮動小数点形式は次のように指定される。
フォーマットは
例えば、b = 10、p = 7、emax = 96、emin = −95の場合、仮数は0 ≤ c ≤ を満たす。9 999 999であり、指数は−101 ≤ q ≤ 90を満たします。したがって、表現できる最小の非ゼロの正の数は 1×10 −101で、最大値は 9999999×10 90(9.999999×10 96)なので、数値の全範囲は −9.999999×10 96から 9.999999×10 96です。数 − b 1− emaxとb 1− emax(ここでは −1×10 −95と 1×10 −95)は(大きさが)最小の正規数です。これらの最小数の間にある非ゼロの数は、非正規数と呼ばれます。
数値によっては、複数の浮動小数点表現が可能な場合があります。例えば、b = 10、p = 7の場合、-12.345は-12345×10 -3、-123450×10 -4、-1234500×10 -5 で表現できます。ただし、算術演算などのほとんどの演算では、結果(値)は入力の表現に依存しません。
10進形式では、任意の表現が有効であり、これらの表現の集合はコホートと呼ばれます。結果が複数の表現を持つ場合、標準規格ではコホートのどのメンバーが選択されるかが指定されます。
バイナリ形式では、表現可能な最小の指数を選択して値を正確に表現することで、表現が一意になります。また、指数は直接表現されず、表現可能な最小の指数が 1 として表現され、非正規数には 0 が使用されるようにバイアスが追加されます。指数が通常の範囲内にある数 (指数フィールドがすべて 1 でもすべて 0 でもない数) の場合、仮数の先頭ビットは常に 1 になります。したがって、先頭の 1 は、メモリ エンコードで明示的に存在するのではなく、暗黙的に存在する可能性があり、標準では、明示的に表現される仮数の部分は 0 と 1 の間になります。この規則は、先頭ビット規則、暗黙のビット規則、または隠しビット規則と呼ばれます。この規則により、バイナリ形式で精度を 1 ビット追加できます。非正規数は、通常の指数範囲外の指数を持ち、最小の通常数に使用される最小の表現指数でスケールされるため、先頭ビット規則は使用できません。
複数のエンコードが可能であるため(少なくとも交換フォーマットと呼ばれるフォーマットでは)、NaNは他の情報も運ぶ可能性があります。符号ビット(意味はありませんが、一部の操作で使用される場合があります)とペイロード(NaNの発生源を示す診断情報用です)です(ただし、ペイロードにはNaNボックス化[ 10 ] [ 11 ] [ 12 ]など、他の用途もあります)。
この規格では、数値の基数と交換エンコードで使用されるビット数に基づいて命名された5つの基本形式が定義されています。2進浮動小数点基本形式は3つ(32、64、または128ビットでエンコード)で、10進浮動小数点基本形式は2つ(64または128ビットでエンコード)です。binary32形式とbinary64形式は、それぞれIEEE 754-1985の単精度形式と倍精度形式です。準拠実装では、少なくとも1つの基本形式を完全に実装する必要があります。
この規格では、これらの基本フォーマットを一般化する交換フォーマットも定義されています。 [ 13 ]バイナリフォーマットでは、先頭ビットの規則が必要です。次の表は、可能な交換フォーマット(基本フォーマットを含む)のいくつかをまとめたものです。
| 有効数字 | 指数 | プロパティ[ b ] | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 名前 | 通称 | 基数 | 数字[ c ] | 分 | マックス | マックスバル | ログ10 MAXVAL | MINVAL >0 (正常) | MINVAL >0 (正常範囲外) | 注記 | |
| バイナリ16 | 半精度 | 2 | 11 | 3.31 | −14 | 15 | 65504 | 4.816 | 6.10 × 10 −5 | 5.96 × 10 −8 | 交換 |
| バイナリ32 | 単精度 | 2 | 24 | 7.22 | −126 | 127 | 3.40 × 1038 | 38.532 | 1.18 × 10 −38 | 1.40 × 10 −45 | 基本 |
| バイナリ64 | 倍精度 | 2 | 53 | 15.95 | −1022 | 1023 | 1.80 × 10308 | 308.255 | 2.23 × 10 −308 | 4.94 × 10 −324 | 基本 |
| バイナリ128 | 4倍精度 | 2 | 113 | 34.02 | −16382 | 16383 | 1.19 × 104932 | 4932.075 | 3.36 × 10 −4932 | 6.48 × 10 −4966 | 基本 |
| バイナリ256 | 8倍精度 | 2 | 237 | 71.34 | −262142 | 262143 | 1.61 × 1078,913 | 78913.207 | 2.48 × 10 −78913 | 2.25 × 10 −78984 | 交換 |
| 10進32 | 10 | 7 | 7 | −95 | 96 | 1.0 × 1097 | 97 − 4.34 × 10 −8 | 1 × 10 −95 | 1 × 10 −101 | 交換 | |
| 10進64 | 10 | 16 | 16 | −383 | 384 | 1.0 × 10385 | 385 − 4.34 × 10 −17 | 1 × 10 −383 | 1 × 10 −398 | 基本 | |
| 10進128 | 10 | 34 | 34 | −6143 | 6144 | 1.0 × 106145 | 6145 − 4.34 × 10 −35 | 1 × 10 −6143 | 1 × 10 −6176 | 基本 | |
上記の表では、整数値は正確な値ですが、小数点表記の値(例:1.0)は四捨五入された値です。記載されている最小指数は通常の数値のものです。特殊な非正規数表現では、精度が多少低下しますが、さらに小さい(絶対値が小さい)数値を表すことができます。例えば、binary64で表現できる最小の正の数は2 −1074です。この −1074 という数値には、最小値 −1022 と、53ビットの有効数字のうち1ビットを除くすべて(2 −1022 − (53 − 1) = 2 −1074 )が含まれます。
小数点以下の桁数とは、その形式の精度を小数点以下の桁数で表したものです。これは、桁数× log 10の基数で計算されます。例えば、binary128 は34桁の小数点以下の桁数とほぼ同じ精度です。
log 10 MAXVALは、エンコードの範囲を表す尺度です。その整数部は、小数点の前の仮数部に1桁の数字が付いた科学的記数法で出力された値の最大指数です(例:1.698 × 1038は32進数の最大値に近い9.999999 × 1096は 10 進数の最大値です32)。
バイナリ32(単精度)とバイナリ64(倍精度)形式は、現在最も一般的に使用されている2つの形式です。下の図は、ある範囲の値における両方の形式の絶対精度を示しています。この図は、数値の期待値と必要な精度に基づいて適切な形式を選択する際に役立ちます。

32ビット浮動小数点のレイアウトの例は次の通りです。

64 ビットのレイアウトも同様です。
標準規格では、オプションとして拡張精度形式と拡張可能精度形式が規定されており、これらは基本形式よりも高い精度を提供します。[ 14 ]拡張精度形式は、より高い精度とより広い指数範囲を使用して基本形式を拡張します。拡張可能精度形式では、ユーザーが精度と指数範囲を指定できます。実装では、このような形式に対して任意の内部表現を使用できます。定義する必要があるのは、そのパラメータ(b、p、およびemax)だけです。これらのパラメータは、表現できる有限数の集合(与えられた基数に対する符号、仮数、および指数の組み合わせ)を一意に記述します。
標準規格では、言語標準がサポートされる各基数bに対してpとemax を指定する方法を提供することが推奨されています。[ 15 ]標準規格では、言語標準と実装が、各基数bに対してサポートされる最大の基本形式よりも高い精度を持つ拡張形式をサポートすることが推奨されています。[ 16 ] 2つの基本形式の間の精度を持つ拡張形式の場合、指数範囲は次に広い基本形式と同じでなければなりません。したがって、例えば64ビットの拡張精度2進数は、少なくとも16383の 'emax' を持つ必要があります。x87 80ビット拡張形式はこの要件を満たしています。
オリジナルのIEEE 754-1985規格にも拡張フォーマットの概念はありましたが、eminとemaxの間には強制的な関係はありませんでした。例えば、Motorola 68881の80ビットフォーマット[ 17 ](emin = − emax)は、準拠した拡張フォーマットでしたが、2008年の改訂では非準拠となりました。
交換形式は、特定の形式の固定長のビット文字列を使用して浮動小数点データを交換することを目的としています。
2進浮動小数点数の交換には、16ビット、32ビット、64ビット、および128ビット以上の任意の32ビットの倍数[ e ]の長さの交換形式が定義されています。16ビット形式は、小さな数値(例えば、グラフィックス用)の交換または保存を目的としています。
これらのバイナリ交換形式の符号化方式は、IEEE 754-1985 の符号化方式と同じです。つまり、符号ビット、バイアスによる指数オフセットを表すw個の指数ビット、そして仮数を表すp − 1 個のビットです。kビット形式 の指数フィールドの幅は、w = round(4 log 2 ( k )) − 13として計算されます。既存の 64 ビット形式と 128 ビット形式はこの規則に従いますが、16 ビット形式と 32 ビット形式では、この式で得られる指数ビット数 (それぞれ 3 ビットと 7 ビット) よりも多くの指数ビット (それぞれ 5 ビットと 8 ビット) が存在します。
IEEE 754-1985と同様に、バイアス指数フィールドはすべて1ビットで埋められ、無限大(後続仮数フィールド = 0)またはNaN(後続仮数フィールド ≠ 0)を示します。NaNの場合、Quiet NaNとSignaling NaNは、後続仮数フィールドの最上位ビットのみを使用して区別されます([ f ])。ペイロードは残りのビットで保持されます。
10進浮動小数点数の交換には、32ビットの任意の倍数の交換形式が定義されています。2進数交換と同様に、10進数交換形式の符号化方式は、符号、指数、および仮数を符号化します。2つの異なるビットレベルの符号化が定義されており、使用されている符号化を示す外部的なインジケータが必要になる場合があるため、交換は複雑になります。
2つのオプションにより、仮数を圧縮された10進数列(densely packed decimal)としてエンコードするか、あるいは2進整数としてエンコードすることができます。前者は標準規格のハードウェア実装に直接適しており、後者はバイナリコンピュータ上でのソフトウェアエミュレーションに適しています。どちらの場合も、エンコード可能な数値セット(符号、仮数、指数の組み合わせ)は同一であり、特殊な値(最小指数の±ゼロ、±無限大、静止NaN、シグナリングNaN)のエンコードも同一です。
この規格では5つの丸め規則が定義されています。最初の2つの規則は最も近い値に丸められ、その他の規則は「指示丸め」と呼ばれます。
極端な場合、絶対値が k より厳密に小さい値は、最小または最大の有限数(値の符号によって異なります)に丸められます。この絶対値を持つ数値は同点とみなされます。この同点の選択は、指数に制限がなければ、次に表現可能な浮動小数点数であるkと の中間点として概念化できます。絶対値がkより厳密に大きい数値は、対応する無限大に丸められます。[ 18 ]
「最も近い値に丸め、偶数と同数」は2進浮動小数点のデフォルトであり、10進数では推奨されるデフォルトです。「最も近い値に丸め、偶数と同数」は10進数の実装でのみ必須です。[ 19 ]
| モード | 値の例 | |||
|---|---|---|---|---|
| +11.5 | +12.5 | −11.5 | −12.5 | |
| 最も近い、偶数に等しい | +12.0 | +12.0 | −12.0 | −12.0 |
| 最も近い、ゼロから離れた | +12.0 | +13.0 | −12.0 | −13.0 |
| 0に向かって | +11.0 | +12.0 | −11.0 | −12.0 |
| +∞に向かって | +12.0 | +13.0 | −11.0 | −12.0 |
| −∞に向かって | +11.0 | +12.0 | −12.0 | −13.0 |
別途規定がない限り、浮動小数点演算の結果は、無限精度(数学的)な結果に丸め関数を適用することによって決定される。このような演算は、正しく丸められていると言われる。この要件は、正しい丸めと呼ばれる。[ 20 ]
サポートされている算術形式 (基本形式を含む) に必要な操作は次のとおりです。
この標準では、サポートされている算術形式で、ある浮動小数点データを別の浮動小数点データと比較するための比較述語を提供しています。[ 32 ] NaNとの比較は順序なしとして扱われます。-0と+0は等しいものとして比較されます。
標準規格では、サポートされている算術形式の標準メンバーの全順序を定義する述語totalOrderが提供されています。 [ 33 ]この述語は、一方の浮動小数点数が他方の浮動小数点数より小さい場合の比較述語(セクション§比較述語を参照)と一致します。主な違いは以下のとおりです。[ 34 ]
totalOrder述語は、フォーマット内のすべてのエンコーディングに全順序付けを強制するものではありません。特に、一方または両方のエンコーディングが非正規である場合など、同じ浮動小数点表現の異なるエンコーディングを区別しません。[ 33 ] IEEE 754-2019にはtotalOrderの明確化が盛り込まれています。
NaNシグナリングビットの配置に関するIEEE 754-2008勧告に従ったエンコードのバイナリ交換フォーマットの場合、比較は浮動小数点数を符号絶対値の整数に変換するもの(ペイロードの順序がこの比較と一致すると仮定)と同一であり、これはFPUを使用しないFP比較の古いトリックである。[ 35 ]
標準では 5 つの例外が定義されており、各例外はデフォルト値を返し、例外が発生したときに発生する対応するステータス フラグを持ちます。[ g ] その他の例外処理は必要ありませんが、デフォルト以外の追加の代替手段が推奨されます ( § 代替例外処理を参照)。
5つの例外は
これらは IEEE 754-1985 で定義された 5 つの例外と同じですが、ゼロ除算の例外が除算以外の演算にも拡張されています。
いくつかの10進浮動小数点実装では追加の例外が定義されているが[ 36 ] [ 37 ]、これはIEEE 754の一部ではない。
さらに、どちらかのオペランドが無限大の場合や、結果が出力形式に適合しない場合の量子化などの操作も、無効な操作例外を通知します。[ 38 ]
IEEE 754規格では、ゼロは符号付きであり、「正のゼロ」(+0)と「負のゼロ」(-0)の両方が存在することを意味します。ほとんどのランタイム環境0では、正のゼロは通常「 」、負のゼロは「 」と表示されます-0。数値比較ではこれら2つの値は等価ですが、一部の演算では+0と-0に対して異なる結果が返されます。例えば、1/(-0)は負の無限大を返しますが、1/(+0)は正の無限大を返します(したがって、1/(1/±∞) = ±∞という恒等式は維持されます)。x = 0で不連続性を持つ他の一般的な関数で、+0と-0を異なる扱いをする可能性のあるものとしては、 Γ( x )や、任意の負の数yに対するy + xiの主平方根などがあります。他の近似法と同様に、「負のゼロ」を含む演算は、時折混乱を引き起こす可能性があります。例えば、IEEE 754では、x = yは常に1/ x = 1/ yを意味するわけではなく、0 = −0ですが、1/0 ≠ 1/(−0)です。[ 39 ]さらに、 ±0の逆平方根[ h ]は±∞ですが、実数上の 数学関数は負の値を持ちません。
非正規値は、アンダーフローギャップのすぐ外側にある隣接する値と絶対距離が同じ値でアンダーフローギャップを埋めます。これは、アンダーフローギャップにゼロを置き、アンダーフローの結果がゼロに置き換えられていた(ゼロにフラッシュされていた)従来の方法よりも改善されています。 [ 40 ]
最新の浮動小数点ハードウェアは通常、非正規値 (および正規値) を処理するため、非正規値のソフトウェア エミュレーションは必要ありません。
拡張実数直線上の無限大は、1、1.5 などの通常の浮動小数点値と同様に、IEEE 浮動小数点データ型で表現できます。これらはエラー値ではありませんが、多くの場合(丸め方法によって異なりますが)、オーバーフローが発生した場合の代替値として使用されます。ゼロ除算例外が発生した場合、正または負の無限大が正確な結果として返されます。無限大は数値として表現することもできます(C言語の "INFINITY" マクロ、またはプログラミング言語でその構文がサポートされている場合は " ∞ ")。
IEEE 754では、無限大を次のように適切に処理する必要がある。
IEEE 754では、0/0、∞×0、sqrt(-1)といった特定の「無効な」演算の結果として返される「非数」(NaN)と呼ばれる特別な値が規定されています。一般的に、NaNは伝播されます。つまり、NaNを含むほとんどの演算はNaNになります。ただし、任意の浮動小数点値に対して定義された結果を返す関数は、NaNに対しても同様の結果を返します(例:NaN ^ 0 = 1)。NaNには、デフォルトの静寂NaNと、オプションで生成されるシグナリングNaNの2種類があります。あらゆる算術演算(数値比較を含む)においてシグナリングNaNが発生すると、「無効な演算」例外が通知されます。
標準規格で規定されているNaNの表現には、エラーの種類や発生源をエンコードするために使用できる未指定ビットがいくつかありますが、そのエンコードに関する標準規格は存在しません。理論的には、シグナリングNaNは、ランタイムシステムが初期化されていない変数にフラグを付けたり、通常の値による計算速度を低下させることなく浮動小数点数を他の特殊な値で拡張したりするために使用できますが、このような拡張は一般的ではありません。このアプローチの変種(「NaNボックス化」と呼ばれることもあります)は、一部のJavaScriptランタイム[ 41 ]やLuaJIT [ 42 ]で、64ビットポインタ値とIEEE 754倍精度浮動小数点値を同じデータ型に格納するために使用されており、ランタイムは浮動小数点値のための余分なメモリ割り当てや間接参照のオーバーヘッドを排除できます。

ここで解説するIEEE 754規格のより難解な機能、例えば拡張形式、NaN、無限大、非正規数などは、数値解析の専門家や高度な数値計算アプリケーションにのみ関係する、という誤解がよくあります。実際はその逆です。これらの機能は、数値計算に精通していないプログラマーにも安全で堅牢なデフォルト設定を提供するだけでなく、専門家による高度な数値計算ライブラリのサポートも実現するように設計されています。 IEEE 754の主要な設計者であるウィリアム・カーハンは、「…二進浮動小数点演算に関するIEEE標準754の機能は、数値計算の専門家以外には利用できない機能であるとみなすのは誤りである。事実は全く逆である。1977年、これらの機能は可能な限り幅広い市場に対応するためにIntel 8087に組み込まれた…エラー分析は、IEEE標準754のような、プログラマーの善意による無知を適度に許容する浮動小数点演算を設計する方法を示している」と指摘している。[ 43 ]
R(z) := 7 − 3/[z − 2 − 1/(z − 7 + 10/[z − 2 − 2/(z − 3)])]場合のようなゼロ除算は+無限大を与えることで正しく処理されるため、このような例外は安全に無視できるからである。[ 44 ] Kahanが指摘したように、アリアン5ロケットの喪失を引き起こした、浮動小数点から16ビット整数への変換オーバーフローに続く未処理のトラップは、デフォルトのIEEE 754浮動小数点ポリシーでは発生しなかったであろう。[ 43 ]単精度および倍精度形式の特徴として、そのエンコードにより、ビットが符号付き絶対値の整数を表しているかのように、浮動小数点ハードウェアを使用せずに簡単にソートできることが挙げられますが、これが設計上の考慮事項であったかどうかは不明です(初期のIBM 16進浮動小数点表現にも、正規化された数値に対してこの特徴があったことは注目に値します)。一般的な2の補数表現では、ビットを符号付き整数として解釈すると、正の値は正しくソートされますが、負の値は反転されます。これを修正する方法の1つとして、正の値の符号ビットと負の値のすべてのビットを反転するXOR演算を行うことで、すべての値が符号なし整数(-0 < +0)としてソート可能になります。[ 35 ]
この標準規格では、ユーザー定義のデフォルト値の事前置換、トラップ(何らかの方法で制御フローを変更する例外)、そしてtry/catchなどのフローを中断する他の例外処理モデルなど、様々な形態のオプションの例外処理が推奨されています。トラップやその他の例外メカニズムは、IEEE 754-1985と同様に、オプションのままです。
標準規格の第9項では、言語規格で定義されるべき追加の数学演算[ 47 ]が推奨されている。[ 48 ] 標準規格に準拠するために必須の演算はない。
以下は推奨される算術演算であり、正しく丸められなければならない。[ 49 ]
、関数は必要性が低いと判断されたため、IEEE 754-2008規格には含まれていなかった。[ 51 ]および関数についても言及されていたが、これは誤りとされた。[ 5 ]これら3つはすべて2019年の改訂版で追加された。
推奨される操作には、動的モードの丸め方向の設定とアクセスも含まれ、[ 52 ]、実装定義のベクトル縮小操作(合計、スケール積、ドット積など)が含まれますが、その精度は標準では指定されていません。[ 53 ]
2019年現在、バイナリ形式における拡張算術演算[ 54 ]も推奨されています。加算、減算、乗算を対象とするこれらの演算は、形式内で最も近い値に正しく丸められた結果と、形式内で正確に表現可能な誤差項からなる値のペアを生成します。この規格の発行時点では、ハードウェア実装は知られていませんが、よく知られたアルゴリズムを用いて、非常によく似た演算がソフトウェアで既に実装されていました。これらの標準化の歴史と動機については、背景資料で説明されています。[ 55 ] [ 56 ]
2019年現在、IEEE 754-2008で以前必須とされていたminNum、maxNum、minNumMag、maxNumMagは、非結合性のため非推奨となりました。代わりに、2つの新しい最小値および最大値演算のセットが推奨されています。[ 57 ] 最初のセットには 、 minimum、minimumNumber、maximum、maximumNumberが含まれます。2番目のセットには、 minimumMagnitude、minimumMagnitudeNumber、maximumMagnitude、maximumMagnitudeNumberが含まれます。この変更の経緯と動機については、背景資料で説明されています。[ 58 ]
この標準は、言語標準が演算シーケンスのセマンティクスをどのように規定すべきかを推奨し、リテラルの意味や結果の値を変更する最適化の微妙な点を指摘しています。対照的に、1985年版の以前の標準では、言語インターフェースの側面が未規定のままであり、コンパイラ間の動作の不一致や、最適化コンパイラにおける最適化レベルの差異につながっていました。
プログラミング言語は、ユーザーが各基数について式の中間計算の最小精度を指定できるようにする必要があります。これは標準規格ではpreferredWidthと呼ばれ、ブロックごとに設定できる必要があります。式内の中間計算は、オペランドの幅と、設定されている場合は preferredWidth の最大値を使用して計算され、一時データは保存される必要があります。したがって、例えば、x87浮動小数点ハードウェアをターゲットとするコンパイラは、中間計算に拡張倍精度形式を使用する必要があることを指定する手段を持つ必要があります。後続の式を評価する際は、丸めや変数への代入前の先行値ではなく、常に変数に格納された値を使用する必要があります。
IEEE 754-1985版では、実装において多くのバリエーション(一部の値のエンコードや特定の例外の検出など)が認められていました。IEEE 754-2008ではこれらの許容範囲は縮小されましたが、それでもいくつかのバリエーション(特にバイナリ形式)は依然として残っています。再現性に関する条項では、言語標準において再現可能なプログラム(つまり、言語のあらゆる実装において同じ結果を生成するプログラム)を作成するための手段を提供することが推奨されており、再現可能な結果を達成するために何を行う必要があるかが規定されています。
再現性がない可能性のある動作の具体例としては、C言語やC++言語が挙げられます。これらの言語では、浮動小数点演算の結果に高い精度を使用したり、浮動小数点式の縮約(通常の乗算と加算をFMAや1.0/sqrt(x)逆平方根に1命令で変換するなど)が可能です。[ 59 ] GCCやcl.exeなどのC/C++コンパイラは、明示的に許可されない限り、通常、デフォルトで両方を許可します。これらの変更により、精度を明らかに損なうことなく、より高速なコードを生成できるためです。コンパイラは、より明確に非準拠の「高速」最適化も提供しています。[ 60 ] [ 61 ] Cの数学関数は通常、「正しく丸められる」ように実装されておらず、問題をさらに悪化させています。[ 62 ]浮動小数点環境は、サードパーティのコードによって予期せず変更される可能性もあります。
標準規格では、基本形式と外部文字シーケンス形式間の変換操作が要求されています。[ 63 ]すべての形式において、10進文字形式との変換が必要です。外部文字シーケンスへの変換は、最も近い偶数への丸め、偶数への結びつきを使用して元の数値に戻すことで実現する必要があります。quiet NaNまたはsignaling NaNのペイロードを保持する必要はなく、外部文字シーケンスからの変換によってsignaling NaNがquiet NaNに変換される可能性があります。
元の2進値は、次のように10進数に変換して戻すことで保存されます。[ 64 ]
他のバイナリ形式では、必要な小数点以下の桁数は[ i ]です。
ここで、pはバイナリ形式の有効ビット数です。たとえば、binary256 の場合は 237 ビットです。
10 進浮動小数点形式を使用する場合、10 進表現は次のように保存されます。
2進数から10進数、10進数から2進数への正しく丸められた変換アルゴリズムとコードについては、Gay [ 65 ]によって議論されており、テストについてはPaxsonとKahan [ 66 ]によって議論されています。
この標準規格では、 C99の16進浮動小数点リテラルに基づいて、外部16進仮数文字シーケンスとの間の変換を提供することが推奨されています。このようなリテラルは、オプションの符号(または)、指示子「0x」、ピリオド付きまたはピリオドなしの16進数、指数指示子「p」、およびオプションの符号付き10進指数で構成されます。構文は大文字と小文字を区別しません。[ 67 ] 10進指数は2の累乗でスケーリングされます。例えば、は1/16、は1/256です。[ 68 ]+-0x0.1p00x0.1p-4
VMの設計上の側面: [...] NaNタグ: スタックスロットとテーブルスロットには、64ビットのタグ付き値が使用されます。
成長率は-1未満にはならないため、そのような成長率は無効な例外を示す。
{{cite book}}: CS1 maint: numeric names: authors list (link){{cite book}}: CS1 maint: numeric names: authors list (link)