• 検索結果がありません。

IA-32 インテル ®

4.8.4. 丸め

浮動小数点演算を実行するとき、プロセッサは、可能な限り、デスティネーション・フォーマット (単精度、倍精度、または拡張倍精度浮動小数点)で、無限精度の浮動小数点数の結果を返す。しか し、IEEE規格754の浮動小数点フォーマットでは実数連続体の値の一部しか表現できないため、無 限精度の結果を、デスティネーション・オペランドのフォーマットで正確にコード化できないこと がある。

例えば、以下の値(a)は、24ビットの小数部分を持つ。この小数の最下位ビット(下線のビット)は、

単精度フォーマットでは正確にコード化できない(単精度実数フォーマットの小数部分は23ビット しかない)。

(a) 1.0001 0000 1000 0011 1001 0111E2 101

プロセッサは、この結果(a)を丸めるために、最初に、aを最も近い値で囲む2つの表現可能な小数b とcを選択する(b < a < c)

(b) 1.0001 0000 1000 0011 1001 011E2 101 (c) 1.0001 0000 1000 0011 1001 100E2 101

次に、プロセッサは、選択された丸めモードに従って、結果をbまたはcに設定する。丸めによって 結果に誤差が生じるが、この誤差は、結果を丸めた値の最後の桁(浮動小数点値の最下位ビットの位 置)の1単位より小さい。

IEEE754は、直近値への丸め、切り上げ、切り捨て、およびゼロ方向への丸めの4つの丸めモードを

定義している(表4-8.を参照)。IA-32アーキテクチャのデフォルトの丸めモードは、直近値への丸め である。このモードは、真の結果に対する最も正確で統計的に偏りのない推定が可能であり、ほと んどのアプリケーションに適合する。

切り上げモードと切り捨てモードは、有向丸めと呼ばれ、区間演算に使用される。多段階にわたる 計算で中間結果が丸められる場合は、区間演算を使用して、真の結果の上限と下限を求めることが できる。

ゼロ方向への丸めモード(「チョップ」モードとも呼ばれる)は、x87 FPUで整数演算を実行するとき によく使用される。

丸められた結果は、不正確結果と呼ばれる。プロセッサが不正確結果を返した場合は、浮動小数点 精度(不正確)フラグ(PE)がセットされる(4.9.1.6.項 「不正確結果(精度)例外 (#P)」を参照)。

丸めモードは、比較演算、正確な結果を返す演算、NaNの結果を返す演算には影響を与えない。

表4-8. 丸めモードと丸め制御(RC)フィールドのエンコーディング

丸めモード RCフィールド

の設定 説明

直近値への丸め (偶数)

00B 丸められた結果は、無限精度の結果に最も近い値になる。2つの値が 同じ近さの場合は、結果は偶数値(すなわち、最下位ビットが0 )になる。これがデフォルトである。

切り捨て (-∞方向)

01B 丸められた結果は、無限精度の結果に最も近い値(ただし、無限精度 の結果より大きくない値)になる。

切り上げ (+∞の方向)

10B 丸められた結果は、無限精度の結果に最も近い値(ただし、無限精度 の結果より小さくない値)になる。

ゼロ方向への丸め (真の切り捨て)

11B 丸められた結果は、無限精度の結果に最も近い値(ただし、無限精度 の結果より絶対値が大きくない値)になる。

4.8.4.1. 丸め制御(RC)フィールド

IA-32アーキテクチャでは、丸めモードは、2ビットの丸め制御(RC)フィールドによって制御される

(このフィールドのエンコーディングを表4-8.に示す)。RCフィールドは、次の2つの異なる位置に 実装されている。

x87 FPUコントロール・レジスタ(ビット10とビット11)

MXCSRレジスタ(ビット13とビット14)

これらの2つのRCフィールドは、同じ機能を持っているが、プロセッサ内の異なる実行環境の丸め モードを制御する。x87 FPUコントロール・レジスタのRCフィールドは、x87 FPU命令によって実 行される計算の丸めを制御する。MXCSRレジスタのRCフィールドは、SSEとSSE2によって実行さ れるSIMD浮動小数点計算の丸めを制御する。

4.8.4.2. SSEおよびSSE2変換命令による切り捨て

SSEおよびSSE2の変換命令CVTTPD2DQ、CVTTPS2DQ、CVTTPD2PI、CVTTPS2PI、CVTTSD2SI、

およびCVTTSS2SIは、浮動小数点値から整数への変換の結果が不正確である場合、その結果を自動

的に切り捨てる。切り捨てとは、表4-8.で説明したゼロ方向への丸めモードを意味する。

4 .9 . 浮動小数点例外の概要

この節では、IA-32アーキテクチャの浮動小数点例外とその処理の概要について説明する。x87 FPU、

およびSSE、SSE2に固有の内容については、以下の各節を参照のこと。

8.4.節「x87 FPU浮動小数点例外処理」

11.5.節「SSESSE2の例外」

IA-32アーキテクチャは、浮動小数点オペランドを操作するとき、以下の6クラスの例外条件を認識

し、検出する。

無効操作(#I)

ゼロ除算(#Z)

デノーマル・オペランド(#D)

数値オーバーフロー(#O)

数値アンダーフロー(#U)

不正確結果(精度)(#P)

本書では、"#"記号に続く大文字1文字または2文字の表記(例えば、#P)を使用して、例外条件を表 す。これは単なる省略形であり、アセンブラのニーモニックとは無関係である。

注記

上記のすべての例外は、デノーマル・オペランド例外(#D)を除いて、IEEE規格 754に定義されている。

無効操作例外、ゼロ除算例外、およびデノーマル・オペランド例外は、計算前型の例外(すなわち、

算術演算が実行される前に検出される例外)である。数値アンダーフロー例外、数値オーバーフロー 例外、および精度例外は、計算後型の例外である。

6つの例外クラスのそれぞれに、対応するフラグ・ビット(IE、ZE、OE、UE、DE、またはPE)とマ スク・ビット(IM、ZM、OM、UM、DM、またはPM)がある。1つ以上の浮動小数点例外条件が検出 されると、プロセッサは、該当するフラグ・ビットをセットし、それに対応するマスク・ビットの 設定に基づいて、次のいずれかの処置をとる。

マスク・ビットがセットされている場合。例外を自動的に処理して、あらかじめ定義された(通 常はそのまま使用可能な)結果を返し、プログラムの実行を続ける。

マスク・ビットがクリアされている場合。ソフトウェア例外ハンドラを起動して、例外を処理 する。

例外に対するマスク応答(デフォルト)は、各例外条件に対して妥当な結果が得られるように選択さ れており、ほとんどの浮動小数点アプリケーションでは、一般に満足のいく結果が得られる。プロ グラマは、それぞれの浮動小数点例外をマスクしたり、マスクを解除することで、ほとんどの例外 の処理をプロセッサに任せて、最も重大な例外条件だけをソフトウェア例外ハンドラで処理するこ とができる。

例外フラグは「スティッキー・フラグ」であるため、前回クリアされた後に発生した例外を累積的 に記録している。プログラマは、すべての例外をマスクしておき、計算を実行した後で例外フラグ を調べて、計算中に例外が検出されたかどうかを確認することができる。

IA-32アーキテクチャでは、浮動小数点例外フラグ・ビットとマスク・ビットは、次の2つの異なる

位置に実装されている。

x87 FPUステータス・ワードおよび制御ワード。フラグ・ビットは、x87 FPUステータス・ワー

ドのビット0〜5にある。マスク・ビットは、x87 FPU制御ワードのビット0〜5にある(図8-6 と図8-4を参照)。

MXCSRレジスタ。フラグ・ビットは、MXCSRレジスタのビット0〜5にある。マスク・ビッ

トは、MXCSRレジスタのビット7〜12にある(図10-3.を参照)。

これらの2組のフラグ・ビットとマスク・ビットは、同じ機能を持っているが、プロセッサ内の異な る実行環境の例外の報告と制御に使用される。x87 FPUステータス・ワードおよび制御ワード内のフ ラグ・ビットとマスク・ビットは、x87 FPU命令によって実行される計算で発生した例外の報告とマ スクを制御する。MXCSRレジスタ内のそれに対応するビットは、SSEとSSE2によって実行される SIMD浮動小数点計算で発生した例外の報告とマスクを制御する。

ただし、例外がマスクされている場合、プロセッサはマスク応答の実行後も命令の実行を続けるた め、1つの命令で複数の例外が検出されることがある。例えば、プロセッサは、デノーマル・オペラ ンドを検出し、この例外に対するマスク応答を実行した後、数値アンダーフローを検出することが ある。