本節では、x87 FPU、SSE、SSE2、SSE3浮動小数点命令において実数がどのように浮 動小数点フォーマットで表現されるかを説明する。また、ノーマル型数、デノーマル 型数、バイアス付き指数、符号付きゼロ、NaNなどの用語についても説明する。2進 浮動小数点演算技法やIEEE 754浮動小数点演算規格をすでに熟知している読者であれ ば、本節を飛ばしても差し支えない。
4.8.1.
実数体系図
4-9.に示すように、実数体系はマイナス無限大(-
∞)からプラス無限大(+∞)までの範囲にある実数の連続体で構成される。
コンピュータが持つことができるレジスタのサイズや数には制限があるため、実数
(浮動小数点)の計算では実数の連続体の一部分しか使用できない。図
4-9.
の下部に示 すように、IA-32アーキテクチャがサポートする実数の部分集合は、実数体系を近似 的に表現したものである。この実数の部分集合の範囲と精度は、IEEE 754規格の浮動 小数点フォーマットによって決まる。4.8.2.
浮動小数点フォーマット実数計算の速度と効率を上げるため、コンピュータやマイクロプロセッサでは一般的 に実数を
2
進浮動小数点フォーマットで表す。このフォーマットでは、実数は符号、仮数、指数の
3
つの部分で構成される(図4-10.
を参照)。符号部は、数値が正(
0
)か負(1
)のいずれであるかを示す2
進値である。仮数部は、1
ビットの2
進整数部分(J
ビットとも呼ばれる)と2
進小数部分で構成される。J
ビッ トは表現されないで、暗黙の値となる場合が多い。指数部は、仮数部が累乗される2
のベキ値を表す2
進整数である。表
4-5.
に、通常の10
進フォーマットの実数178.125
が、どのようにIEEE
規格754
浮動 小数点フォーマットで格納されるかを示す。この表から、実数表記が、単精度実数の32
ビット浮動小数点フォーマット(FPU
がサポートする浮動小数点フォーマットの1
つ)に移行する経緯が分かる。浮動小数点フォーマットでは、仮数部はノーマライズされ(
4.8.2.1.
項「ノーマル型数」を参照)、また指数部にはバイアスがかけられる(
4.8.2.2.
項「バイアス付き指数」を参照)。単精度浮動小数点フォーマットでは、バイアス定数は
+127
になる。IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
4-16
図4-9. 2進実数体系
図4-10. 2進浮動小数点フォーマット
2進実数体系
IEEE単精度(32ビット)浮動小数点フォーマットで
+10
10.0000000000000000000000 1.11111111111111111111111 精度 2進24ケタ
この範囲内の数は表現 できない
∞ -100 -10 -1 0 1 10 100 ∞
∞ -100 -10 -1 0 1 10 100 ∞
表現可能な2進実数の部分集合
符号部
整数部分(Jビット)
指数部 仮数部
小数部分
データ型
4
4.8.2.1. ノーマル型数
ほとんどの場合、浮動小数点値はノーマル型形式でコード化される。つまり、ゼロの 場合を除き、仮数部は必ず
1
の整数部分と、その後に続く小数部分で構成される。・ 1.fff...ff
1
より小さい値に対しては、先行のゼロが削られる。(先行ゼロが1
つ削られるごとに、指数部が
1
ずつデクリメントされる。)ノーマル型形式で数値を表すと、仮数部に与えられた長さの最大限まで有効桁数を増 やすことができる。要約すると、ノーマル型実数は、
1
と2
の間にある実数を表すノー マル型仮数部と、その実数値の2
進小数点を指定する指数部で構成される。4.8.2.2. バイアス付き指数
IA-32
アーキテクチャでは、浮動小数点数指数部をバイアス付きの形式でコード化する。つまり、バイアス付き指数が常に正の数になるよう、実際の指数に定数(バイア ス定数)が加算される。このバイアス定数の値は、現在使用されている浮動小数点 フォーマットで指数部を表すのに使用可能なビット数によって決まる。バイアス定数 は、最小のノーマル型数がオーバーフローを生じないで逆数に変換できるように選択 される。
IA-32
アーキテクチャが各種サイズの浮動小数点データ型で使用するバイアス定数の一覧については、4.2.2.項「浮動小数点データ型」を参照のこと。
表4-5. 実数および浮動小数点数表記法
表記法 値
通常の10進 178.125
科学計算用10進 1.78125E102 科学計算用2進 1.0110010001E2111 科学計算用2進
(バイアス付き指数)
1.0110010001E210000110
IEEE単精度フォーマット 符号 バイアス付き指数 ノーマル型仮数
0 10000110 01100100010000000000000
1.(暗黙)
IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
4-18
4.8.3.
実数および非数のエンコーディングIEEE 754
規格の浮動小数点フォーマットでは、各種の実数や特殊な値をコード化できる。これらの数や値は、通常は次のクラスに分類できる。
・
符号付きゼロ・
デノーマル型有限数・
ノーマル型有限数・
符号付き無限大・ NaN
・
不定数(
NaN
は"Not a Number
(非数)"
を表す。)図
4-11.
に、これらの数や非数のエンコーディングが実数の連続体のどの部分を占めるかを示す。ここに示すエンコーディングは、
IEEE
の単精度(32
ビット)フォーマッ トである。略号"S"
は符号ビットを、"E"
はバイアス付き指数を、"Sig"
は仮数部分を それぞれ表す。指数値は、10
進で示されている。単精度浮動小数点フォーマットでは 整数ビットは暗黙的に指定されるが、仮数部分については整数ビットを示す。図4-11. 実数とNaN
1 0
S E Sig1
−0
1 0 −デノーマル型 有限数 NaN
1 1...254 −ノーマル型
有限数
1 255 −∞
255 SNaN
255 QNaN
注:
3. 符号ビットは無視される。
2. 小数部分は、非ゼロでなければならない。
0 0
S E Sig1
0 0
NaN
0 1...254 0 255
X3 255 1.0XX...2 255 1.1XX...
+0 +デノーマル型 有限数 +ノーマル型 有限数 +∞
SNaN QNaN X3 X3
X3
32ビット浮動小数点フォーマットでの実数およびNaNのエンコーディング -デノーマル型有限数
-ノーマル型有限数 −0
−∞ +∞
+デノーマル型有限数 +ノーマル型有限数 +0
0.XXX...2 0.000...
1.000...
1.XXX...
1.000...
0.000...
0.XXX...2 1.XXX...
1.0XX...2 1.1XX...
1. 小数部分の整数ビットは単精度浮動小数点フォーマットを表す。
データ型
4
IA-32
プロセッサは、実行される演算のタイプによっては、これらの値の任意のものを演算処理したり、演算結果として返せる。以降の各項では、これらの数と非数のク ラスについて説明する。
4.8.3.1. 符号付きゼロ
ゼロは、符号ビットによって
+0
か-0
として表現できる。どちらのエンコーディング も、等しい値を表す。結果としてゼロが得られた場合は、実行された演算と使用され た丸めモードによって符号が決まる。符号付きゼロは、区間演算を実現できるように 用意されたものである。ゼロに符号を付けることによって、アンダーフローが発生し た方向を示すことができる。あるいは逆数変換された結果である∞の符号を示すこと ができる。4.8.3.2. ノーマル型有限数とデノーマル型有限数
非ゼロの有限数は、ノーマル型とデノーマル型の
2
つのクラスに分類できる。ノーマ ル型有限数はあらゆる非ゼロの有限値が含まれるが、これらの値はゼロから∞までの 範囲のノーマル型実数フォーマットでコード化できる。図4-11.
に示す単精度浮動小数 点フォーマットでは、1
から254
10までの範囲のバイアス付き指数を持つすべての数値 が含まれる(バイアスなしの場合は、指数の範囲は-126
10から+12710までになる)。 浮動小数点値が限りなくゼロに近づくと、ノーマル型数値フォーマットを使用して数 を表すことは不可能になる。これは、指数の範囲が不足して、先行のゼロを削るため に2
進小数点を右にシフトすることができなくなるためである。バイアス付き指数がゼロの場合は、仮数部の整数ビットを(場合によっては他の先行 ビットも)ゼロにすることによって表現できるのは小さい数だけになる。この範囲の 数は、デノーマル型(または極小)数と呼ばれる。デノーマル型数の前にゼロを使用 すれば、小さい数を表現することができる。ただし、このデノーマライズ処理によっ て、精度は失われる(小数部分の有効ビット数が、先行ゼロの数だけ減るため)。
ノーマル型浮動小数点計算を実行する場合は、
IA-32
プロセッサは通常はノーマル型 数に対して演算を実行し、ノーマル型数で結果を生成する。結果がデノーマル型数に なった場合は、アンダーフロー条件が発生したことを表す。厳密な条件については、4.9.1.5.
項「数値アンダーフロー例外(#U
)」を参照のこと。デノーマル型数は、段階的アンダーフローと呼ばれる技法によって計算される。表
4-6.
に、デノーマライズ処理における段階的アンダーフローの例を示す。この例では、単 精度フォーマットが使用されているため、最小の指数(バイアスなし)は
-126
10にな る。この例で、真の結果をノーマル型数で得るためには、-129
10の指数が必要になる。-129
10は、使用可能な指数の範囲を超えているため、最小の指数である-126
10に達す るまで先行ゼロを挿入することで、結果がデノーマライズされる。IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
4-20
* バイアスなし、10進数として表現。
極端な場合では、先行ゼロの数だけ右にシフトされてすべての有効ビットが落ちてし まい、結果がゼロになるときがある。
IA-32
アーキテクチャは、デノーマル値を次の方法で処理する。・
可能な限り数値をノーマライズすることで、デノーマル値が生成されるのを避け る。・
デノーマル値が生成された場合にプログラマが検出できるよう、浮動小数点アン ダーフロー例外を設ける。・
計算のソース・オペランドとしてデノーマル値が使用されようとした場合に、プ ロシージャまたはプログラムがそれを検出できるよう、浮動小数点デノーマル・オ ペランド例外を設ける。4.8.3.3. 符号付き無限大
+
∞と-
∞の2つの無限大は、浮動小数点フォーマットで表すことができる最大の正の 実数と負の実数を表す。無限大は、常に、1.00...00の仮数部(整数ビットは暗黙的に 設定される)と、指定されたフォーマットで許容される最大のバイアスされた指数部(例えば、単精度フォーマットでは
255
10)で表現される。無限大の符号は検出と比較が可能である。無限大においては、常に、
-
∞はあらゆる 有限数より小さく、+
∞はあらゆる有限数より大きいと解釈される。また、無限大に 対する演算は、常に正確になる。例外が発生するのは、無限大をソース・オペランド として使用したために無効演算になる場合だけである。結果がデノーマル型数になった場合はアンダーフロー状態を表すのに対し、結果が正 もしくは負いずれかの無限大(∞)数になった場合は結果がオーバーフローであるこ とを表す。この場合、ノーマライズされた計算結果は、指定の結果のフォーマットに 対して許可されている最大の指数より大きいバイアス付き指数を持つ。
表4-6. デノーマライズ処理
操作 符号 指数* 仮数
真の結果 0 -129 1.01011100000...00
デノーマライズ 0 -128 0.10101110000...00 デノーマライズ 0 -127 0.01010111000...00 デノーマライズ 0 -126 0.00101011100...00 デノーマライズ結果 0 -126 0.00101011100...00