IEEE浮動小数点演算規格(IEEE 754)は、1985年に電気電子学会(IEEE)によって制定された浮動小数点演算 に関する技術規格です。この規格は、多様な浮動小数点実装に見られる多くの問題点を解決し、信頼性と移植性を確保しながら利用することの難しさを解消しました。多くのハードウェア浮動小数点演算ユニットがIEEE 754規格を採用しています。
この規格では以下を定義しています。
2008年8月に発行されたIEEE 754-2008は、元のIEEE 754-1985規格のほぼすべてに加え、IEEE 854-1987(基数独立浮動小数点演算)規格を含んでいます。現在のバージョンであるIEEE 754-2019は、2019年7月に発行されました。[ 1 ]これは以前のバージョンのマイナーな改訂であり、主に明確化、欠陥の修正、および新しい推奨操作が組み込まれています。
浮動小数点標準の必要性は、1960年代から1970年代にかけてのビジネスおよび科学計算業界の混乱から生じた。IBMは、精度に関係なく常に7ビットを指数部に使用する16進浮動小数点形式を使用していた。CDCとCrayのコンピュータは、+0と-0の値を許容する1の補数表現を使用していた。CDCの60ビットコンピュータには完全な60ビット加算器が搭載されていなかったため、整数演算は浮動小数点演算ユニットからの精度が48ビットに制限されていた。ゼロ除算による例外処理はコンピュータによって異なっていた。システム間でデータを移動したり、異なるシステムで同じ計算を繰り返したりすることさえ困難な場合が多かった。
浮動小数点演算に関する最初のIEEE規格であるIEEE 754-1985は、1985年に発行された。これはバイナリ浮動小数点演算のみを対象としていた。
7年間の改訂プロセスを経て、ダン・ズラスが議長を務め、マイク・カウリショーが編集を担当した新しいバージョン、IEEE 754-2008が2008年8月に発行されました。これは、IEEE 754-1985(バイナリ浮動小数点演算)とIEEE 854-1987(基数独立浮動小数点演算)の両方の規格に取って代わるものです。この新しい規格には、元の規格のバイナリ形式に加え、バイナリ形式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進数形式の場合、どの表現も有効であり、これらの表現の集合をコホートと呼びます。結果が複数の表現を持つ可能性がある場合、規格ではコホートのどの要素が選択されるかを規定しています。
バイナリ形式の場合、表現は一意になります。絶対値が 2 eminより大きい浮動小数点数のほとんどは、正規数と呼ばれます。正規数の仮数は 1 (含む) から 2 (含まない) の間にあるため、常に先頭に 1 ビットがあります。このビットは表現に明示的に格納されず、暗黙的に保持されます。この規則は、先頭ビット規約、暗黙ビット規約、または隠しビット規約と呼ばれ、形式に 1 ビットの精度を追加できます。正規数の指数には「バイアス」が加算され、結果として得られるバイアス付き指数は常に正の整数になります。2 eminより小さい数は、非正規数と呼ばれます。これらの数は、 eminを表すバイアス付き指数 0 で表されます。非正規数の場合、暗黙の先頭 1 ビットはなくなり、仮数は 0 から 1 の間にあります。
複数のエンコーディングの可能性(少なくとも交換フォーマットと呼ばれるフォーマットでは)により、NaN は他の情報、つまり符号ビット(意味はないが、一部の演算で使用される可能性がある)と、NaN の発生源を示す診断情報のためのペイロード(ただし、ペイロードにはNaN ボックス化[ 10 ] [ 11 ] [ 12 ]などの他の用途がある可能性がある)を運ぶことがあります。
この規格では、数値基数と交換エンコーディングで使用されるビット数に基づいて命名された5つの基本フォーマットが定義されています。バイナリ浮動小数点基本フォーマットは3種類(32ビット、64ビット、または128ビットでエンコード)、10進浮動小数点基本フォーマットは2種類(64ビットまたは128ビットでエンコード)あります。binary32フォーマットとbinary64フォーマットは、それぞれIEEE 754-1985のシングルフォーマットとダブルフォーマットに相当します。準拠する実装では、少なくとも1つの基本フォーマットを完全に実装する必要があります。
この規格では、実装間で浮動小数点データを交換できるように、基本フォーマットを含むさまざまな幅の交換フォーマットを規定しています。各幅の指数部と仮数部のサイズは、幅に基づいて定義されたルールによって決定されます。[ 13 ]次の表は、可能な交換フォーマットの一部(基本フォーマットを含む)をまとめたものです。
上記の表では、整数値は正確な値ですが、10 進表記の値 (例: 1.0) は丸められた値です。記載されている最小指数は通常の数のもので、特殊な非正規数表現では、精度を多少犠牲にすれば、さらに小さい (絶対値で) 数も表現できます。たとえば、binary64 で表現できる最小の正の数は 2 −1074です。−1074 という数値には、 emin値 −1022 と、53 ビットの仮数部のうち 1 ビットを除くすべてのビットが含まれます (2 −1022 − (53 − 1) = 2 −1074 )。
10進数桁数とは、形式の精度を10進数で表したものです。これは、桁数× log 10の底として計算されます。例えば、2進数128は、34桁の10進数とほぼ同じ精度を持ちます。
log 10 MAXVAL は、エンコーディングの範囲を示す尺度です。その整数部分は、小数点より前の有効数字が 1 桁の科学的表記値の出力に表示される最大の指数です (例: 1.698 × 10 38はバイナリ32の最大値9.999999 × 10に近い値です。96は10進数で最大の値です(32)。
バイナリ32(シングル)形式とバイナリ64(ダブル)形式は、現在最も一般的に使用されている形式の2つです。下の図は、両形式における値の範囲ごとの絶対精度を示しています。この図は、数値の期待値と必要な精度に基づいて、適切な形式を選択する際に役立ちます。

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

64ビット版のレイアウトも同様です。
標準では、基本形式よりも高い精度を提供するオプションの拡張精度形式と拡張可能精度形式が規定されています。 [ 14 ]拡張精度形式は、より高い精度とより広い指数範囲を使用することで基本形式を拡張します。拡張可能精度形式では、ユーザーが精度と指数範囲を指定できます。実装では、このような形式に対して任意の内部表現を使用できます。定義する必要があるのは、そのパラメータ ( b、p、およびemax ) だけです。これらのパラメータは、表現できる有限数 (指定された基数に対する符号、仮数、および指数の組み合わせ) のセットを一意に記述します。
標準では、言語標準が、サポートされている各基数bに対してpとemaxを指定する方法を提供することを推奨しています。[ 15 ]標準では、言語標準と実装が、各基数bに対してサポートされている最大の基本形式よりも高い精度を持つ拡張形式をサポートすることを推奨しています。[ 16 ] 2 つの基本形式の間の精度を持つ拡張形式の場合、指数範囲は、次に広い基本形式と同じ大きさでなければなりません。したがって、たとえば 64 ビット拡張精度バイナリ数では、少なくとも 16383 の 'emax' が必要です。x87 80 ビット拡張形式はこの要件を満たしています。
オリジナルのIEEE 754-1985規格にも拡張フォーマットの概念はありましたが、 eminとemaxの間には必須の関係はありませんでした。例えば、Motorola 68881 80ビットフォーマット[ 17 ](emin = −emax )は準拠した拡張フォーマットでしたが、2008年の改訂で非準拠になりました。
交換フォーマットは、特定のフォーマットに対して固定長のビット列を使用して浮動小数点データを交換することを目的としています。
バイナリ浮動小数点数の交換には、長さ16ビット、32ビット、64ビット、および32ビットの倍数(≥ 128)[ 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 の場合、静止 NaN とシグナリング NaN は、末尾の仮数フィールドの最上位ビット[ f ]のみを使用することで区別され、ペイロードは残りのビットで伝送されます。
10進浮動小数点数の交換には、32ビットの倍数となる任意の交換フォーマットが定義されています。2進数交換と同様に、10進数交換フォーマットの符号化方式では、符号、指数、仮数を符号化します。2種類のビットレベル符号化方式が定義されており、使用されている符号化方式を示す外部インジケータが必要になる場合があるため、交換は複雑になります。
2つのオプションにより、仮数を高密度パック10進数を使用した圧縮された10進数列としてエンコードするか、またはバイナリ整数としてエンコードすることができます。前者は標準規格のハードウェア実装に直接適しており、後者はバイナリコンピュータ上でのソフトウェアエミュレーションに適しています。どちらの場合も、エンコード可能な数値セット(符号、仮数、指数の組み合わせ)は同じであり、特殊値(最小指数を持つ±0、±無限大、静止NaN、シグナリングNaN)のエンコード方法も同じです。
この規格では、5つの丸め規則が定義されています。最初の2つの規則は最も近い値に丸め、残りの規則は「指示丸め」と呼ばれます。
極端な場合、絶対値が厳密により小さい値値は、最小値または最大値(値の符号に応じて)に丸められます。この絶対値がちょうど同じ数値はすべて同点とみなされます。この同点の選択は、中間点として概念化できます。そして指数に制限がなければ、これらは次に表現可能な浮動小数点数で、絶対値がより大きいものとなる。絶対値が厳密にkより大きい数は、対応する無限大に丸められる。[ 18 ]
「最も近い値に丸め、同点の場合は偶数に丸める」はバイナリ浮動小数点のデフォルトであり、10進数の推奨デフォルトです。「最も近い値に丸め、同点の場合は外れ値に丸める」は10進数の実装でのみ必要です。[ 19 ]
特に指定がない限り、演算の浮動小数点結果は、無限精度(数学的)結果に丸め関数を適用することによって決定されます。このような演算は正しく丸められていると言われます。この要件は正しい丸めと呼ばれます。[ 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進浮動小数点実装では、IEEE 754の一部ではない追加の例外が定義されています。[ 36 ] [ 37 ]
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では、0 = −0ですが1/0 ≠ 1/(−0)であるため、x = yは必ずしも1/ x = 1/ yを意味するわけではありません。[ 38 ]さらに、 ±0の逆平方根[ h ]は±∞ですが、数学関数は実数上では、負の値は存在しない。
異常値は、アンダーフローギャップのすぐ外側にある隣接値との絶対距離が同じになるような値でアンダーフローギャップを埋めます。これは、アンダーフローギャップに単にゼロを入れ、アンダーフローの結果をゼロに置き換える(ゼロにフラッシュする)という従来の方法よりも改善されています。[ 39 ]
最新の浮動小数点ハードウェアは通常、正規値だけでなく非正規値も処理でき、非正規値のためのソフトウェアエミュレーションを必要としません。
拡張された実数直線の無限大は、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ランタイム[ 40 ]およびLuaJIT [ 41 ]で、64 ビット ポインタ値と IEEE 754 倍精度浮動小数点値を同じデータ型に格納するために使用されており、ランタイムが浮動小数点値のための余分なメモリ割り当てと間接参照のオーバーヘッドを排除できます。

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