IEEE 754
Channel: 宇宙のすべての知識 プリンシピア
Date: 2019-04-26

IEEE 754, by Wikipedia https://ja.wikipedia.org/wiki?curid=355612 / CC BY SA 3.0

#コンピュータの算術
#IEEE標準
IEEE 754

IEEE 754（あいとりぷるいー754、IEEE Standard for Floating-Point Arithmetic: 直訳すると「浮動小数点数算術標準」）は、浮動小数点数の計算で最も広く採用されている標準規格であり、多くのプロセッサなどのハードウェア、またソフトウェア（コンピュータ・プログラム）に実装されている。多くのコンピュータ・プログラミング言語ないしその処理系でも、浮動小数点数処理の一部または全部が IEEE 754 になっている。IEEE 754 が制定される前に成立したC言語などは、仕様上はIEEE 754 が必須となっていないものの、IEEE 754対応の演算命令を使える環境下では、それをそのまま利用して浮動小数点数演算を実装することが多い。一方で、JavaやC#など、言語仕様として IEEE 754 を必須としているものもある。

21世紀に入った後に改定され、2008年8月に制定された IEEE 754-2008 がある。これには、1985年の IEEE 754 制定当初の規格であるIEEE 754-1985、ならびに基数非依存の浮動小数点演算の標準規格 IEEE 854-1987 の両者がほぼすべて吸収されている。IEEE 754-2008 は正式に制定されるまでは、IEEE 754rと呼ばれた。

正式な規格名は、IEEE Standard for Floating-Point Arithmetic (ANSI/IEEE Std 754-2008)である。ISO/IEEEのPSDO（パートナー標準化機関）合意文書に基づき、JTC1/SC 25 を通して国際規格 ISO/IEC/IEEE 60559:2011 として採用され、公表されている。

この標準規格は以下のことを定義している。


またこの規格では、高度な例外処理、追加的な演算（三角関数など）、式評価、再現可能性などを強く推奨している。

このIEEE 754-2008 は、7年をかけて IEEE 754-1985 から置き換えたものである。改訂作業は Dan Zuras が指揮し、が編集責任者となった。なお、IEEE 754-1985 当初からの二進形式（単精度・倍精度）は、そのまま IEEE 754-2008 にも含まれている。さらに、IEEE 754-2008 では、新たに二進形式1つ、十進形式2つも加わって、計5つの基本形式が存在する。IEEE 754-2008 に従う実装では、これらのうち少なくとも1つの基本形式を算術演算と情報交換のために実装しなければならないとされている。

IEEE 754において、浮動小数点数データを取り扱うための符号化が形式 (Formats) として定められている。その中では次のデータを表現できる。

所定の形式で表現可能な有限数値は、基数 ("b")、仮数の桁数すなわち精度 ("p")、指数に関するパラメータ "emax" によって決定される。

括弧内の例のパラメータを用いた場合、0以外で最も小さい値は1×10と表現され、最も大きい値は9999999×10 (または9.999999×10)と表現される。このうち、仮数の桁数が充分確保されているのは1000000×10（または1.000000×10)以上の値であり、これらの数は正規数と呼ばれる。一方、正負の最も0に近い正規数である−1×10と1×10に挟まれた区間は、非正規数として表現される。例えば、1×10はこの例において表現できる最も0に近い正の値だが、仮数の桁数が1しかなく非正規数である。

ゼロは仮数が0の有限数である。符号が別に定義されているので、符号付の2種類のゼロ +0 と-0 が存在する。

IEEE 754標準では、5種類の基本形式を定めており、基数や符号化して使用するビット数に応じて名前が付けられている。その内訳は、32/64/128ビットで表現する3種類の二進浮動小数点形式と64/128ビットで表現する2種類の十進浮動小数点形式からなる。このうち、二進形式の初めの2種は IEEE 754-1985 で単精度 (single)・倍精度 (double)と呼ばれた形式である。3つ目の二進形式は、四倍精度 (quad) とも呼ばれる。同様に、十進形式の2種も倍精度・四倍精度と呼ばれる。

基本二進形式の典型的な精度は実際に仮数部に保持されているビット数よりも1ビット分だけ高い。これは二進形式の正規化された浮動小数点...