IEEE 754

IEEE 754とは



IEEE 754は、1985年IEEEによって策定された浮動小数点算術に関する標準規格です。正式名称は「IEEE Standard for Floating-Point Arithmetic」といい、現代のほとんど全てのコンピュータシステムで採用されています。この規格は、プロセッサ、FPU(浮動小数点演算ユニット)などのハードウェアから、浮動小数点演算ライブラリなどのソフトウェアに至るまで、幅広い分野で利用されています。

多くのプログラミング言語やその処理系では、IEEE 754に準拠していることを明示的に示さないことが多いですが、実際には多くのシステムがこの規格に準拠しています。一方で、JavaやC#のように、言語仕様でIEEE 754への準拠を明記しているものもあります。

改定版:IEEE 754-2008



2008年8月には、改定版である「IEEE 754-2008」が制定されました。この改定版は、1985年の「IEEE 754-1985」と、基数非依存の浮動小数点演算標準である「IEEE 854-1987」の内容をほぼ全て統合しています。正式な規格名は、「IEEE Standard for Floating-Point Arithmetic (ANSI/IEEE Std 754-2008)」です。この規格は、国際規格「ISO/IEC/IEEE 60559:2011」としても採用されています。

定義内容



IEEE 754は、以下の要素を定義しています。

基本形式: 抽象的な数値表現を定義し、二進形式と十進形式があります。通常の浮動小数点数の他、0、負の0、非正規化数、正負の無限大、NaN(非数)などを表現します。
交換形式: ビット列としての表現形式を定め、ファイルや通信での機種依存しないデータのやり取りを可能にします。
丸め規則: 端数処理の方法を規定します。
非正規化数: ゼロに近い数値を表現するための取り決めを定めます。
例外処理: 例外的な状態(ゼロ除算、オーバーフローなど)の扱いを規定します。
四則演算: 四則演算の結果は、数学的に正確な値から指定された丸め規則によって丸められるべきであると定めています。
その他の演算: 高度な例外処理、三角関数などの追加演算、式評価、再現性などを推奨しています。

IEEE 754-2008では、1985年の規格にあった二進形式(単精度・倍精度)に加え、新たな二進形式と二つの十進形式が追加され、計5つの基本形式が存在します。規格に「従っている」と主張する実装は、これらのうち少なくとも1つの基本形式を算術演算と情報交換に利用する必要があります。

形式



IEEE 754では、浮動小数点数を表現するための符号化形式を定めています。これらの形式では、以下のデータを表現できます。

有限数: 2または10を基数とする有限数。符号(s)、仮数(c)、指数(q)の3つの整数で表現され、(-1)^s × c × b^q の値を意味します。
非正規数: ゼロに近い非常に小さな数を表します。
ゼロ: +0と-0の二種類があります。
無限大: +∞と-∞の二種類があります。
NaN (Not a Number): 計算結果が数値として表現できない場合に用いられ、クワイエットNaNとシグナリングNaNの二種類があります。

有限数の表現範囲は、基数(b)、仮数の桁数(精度、p)、指数の最大値(emax)によって決まります。例えば、基数が10、精度が7、emaxが96の場合、0以外の最小値は1×10^-101、最大値は9999999×10^90となります。正規数は、仮数の桁数が十分に確保された数値であり、それよりゼロに近い数値は非正規数として表現されます。

基本形式



IEEE 754標準では、以下の5つの基本形式を定義しています。

二進浮動小数点形式: 32ビット(単精度)、64ビット(倍精度)、128ビットの3種類
十進浮動小数点形式: 64ビット、128ビットの2種類

二進形式の単精度と倍精度は、IEEE 754-1985で定義されたものです。三番目の二進形式は四倍精度と呼ばれます。同様に、十進形式の2種も倍精度・四倍精度と呼ばれます。

二進形式では、仮数部の最上位ビットが常に1であるため、そのビットを省略することで、実質的な精度を1ビット高くしています(ケチ表現)。

拡張精度形式



IEEE 754では、基本形式よりも高い精度で計算するための拡張精度形式が推奨されています。拡張精度形式では、仮数部と指数部の桁数を基本形式よりも大きくすることで、より正確な計算を可能にします。また、ユーザーが精度と指数範囲を指定できる拡張可能精度形式もあります。これらの拡張形式は、内部表現として実装することが可能ですが、必須ではありません。

交換形式



交換形式は、異なるシステム間で浮動小数点数をやり取りするためのビット列形式です。二進浮動小数点数には、16ビット、32ビット、64ビット、128ビット以上の交換形式が定義されています。16ビット形式(半精度)は、主にグラフィック用途などで使用されます。二進交換形式の符号化方式は、IEEE 754-1985と同じで、符号ビット、指数部、仮数部で構成されます。

32ビット単精度の交換形式



32ビット単精度浮動小数点数は、符号(sign)、指数部(exponent)、仮数部(fraction)で構成されます。指数部はバイアス形式で格納されており、実際の値に127を加えたものが格納されています。これは、大小比較を容易にするためです。正規化数の場合、仮数部には小数点以下の部分が格納され、小数点以上の1は省略されます(ケチ表現)。非正規化数、ゼロ、無限大、NaNも特別な方法で表現されます。

例として、-118.625をIEEE 754単精度で表現する場合、符号は1、指数部は133(バイアスを考慮)、仮数部は11011010100000000000000となります。

64ビット倍精度の交換形式



64ビット倍精度も、各フィールドの幅が異なるだけで、基本的な考え方は単精度と同じです。指数部は1023でバイアスされ、仮数部には小数点以下の部分が格納されます。

半精度と四倍精度の交換形式



半精度は16ビットで構成され、四倍精度は128ビットで構成されます。

浮動小数点数の比較



浮動小数点数の比較には、浮動小数点命令を使用するのが最適です。ただし、形式やエンディアンが同じであれば、ビット列として比較することも可能です(NaNを除く)。正の数値同士を比較する場合、符号無し整数として比較しても同じ結果が得られます。

十進浮動小数点数の交換形式



十進浮動小数点数には、32の倍数のビット数を持つ交換形式が定義されています。符号、指数、仮数で構成されますが、仮数部はDensely Packed DecimalやBinary Integer Decimalなどを用いて効率的に符号化されます。

浮動小数点数の丸め



IEEE 754-2008では、5種類の丸めアルゴリズムが定義されています。

最近接丸め: 最も近い表現可能な値に丸めます。中間の値の場合は、偶数またはゼロから遠い方を選択します。
方向丸め: ゼロ方向、正の無限大方向、負の無限大方向のいずれかに丸めます。

演算



IEEE 754では、以下の演算が定義されています。

算術演算(加減乗除、平方根など)
変換(形式間、文字列との変換など)
スケール、量子化
符号の操作
比較、全順序
NaNの分類、判定
フラグの読み書き

全順序判定



全順序述語 totalOrder は、全ての浮動小数点数の大小を判定するために用いられます。通常の比較演算子ではNaNの比較ができませんが、totalOrderでは全ての数を順序づけることができます。

例外処理



IEEE 754-2008では、5種類の例外を定義しています。

無効な演算: 負数に対する平方根など、無効な演算が行われた場合
ゼロ除算: ゼロで除算した場合
オーバーフロー: 結果が大きすぎて表現できない場合
アンダーフロー: 結果が小さすぎて表現できない場合
不正確: 丸めによって正確な結果が得られなかった場合

これらの例外が発生した場合、対応するフラグが設定されます。

推奨



IEEE 754では、以下のような推奨事項があります。

代替の例外処理(ユーザー定義のデフォルト値、トラップ、try/catch構造など)
言語標準での追加演算(対数、冪乗、三角関数など)
式評価における再現性の確保
文字列表現との変換

まとめ



IEEE 754は、浮動小数点演算の標準化において重要な役割を果たしています。この規格を理解することで、コンピュータ上での数値計算における誤差や例外処理についてより深く理解することができます。浮動小数点数の正確な取り扱いには注意が必要であり、実装における再現性や、文字列表現との変換において、規定を遵守することで、より信頼性の高いシステム構築が可能になります。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。