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

IA-32 インテル ®

4.9.1. 浮動小数点例外条件

4.9.1.3. ゼロ除算例外(#Z)

ゼロでない有限のオペランドを0で割ろうとすると、浮動小数点ゼロ除算例外が報告される。ゼロ除 算例外に対するマスク応答は、ZEフラグをセットし、各オペランドの符号の排他的論理和(XOR)演 算によって符号が付けられた無限大を返す。ゼロ除算例外がマスクされていない場合は、ZEフラグ がセットされ、ソフトウェア例外ハンドラが起動され、オペランドは変更されない。

x87 FPU命令、またはSSE、SSE2の実行中に検出されるゼロ除算例外については、以下の各項を参

照のこと。

x87 FPU:8.5.3.項 「ゼロ除算例外 (#Z)」

SIMD浮動小数点例外:11.5.2.3.「ゼロ除算例外(#Z

4.9.1.4. 数値オーバーフロー例外(#O)

算術命令の丸められた結果が、デスティネーション・オペランドの有効範囲内で最も大きい有限値 を超えた場合は、プロセッサは浮動小数点数値オーバーフロー例外を報告する。表4-9.は、各浮動 小数点フォーマットについて、数値オーバーフローのスレッショルド範囲を示している。丸められ た結果がバイアスされていない数値でこのスレッショルド範囲から外れるか、範囲の両端の値と一 致した場合に、オーバーフローが発生する。

数値オーバーフロー例外が発生したときに例外がマスクされていると、プロセッサはOEフラグを セットし、現在の丸めモードに従って、表4-10.に示す値のうち1つを返す(4.8.4.項「丸め」を参照)。

.

表4-9. 数値オーバーフローのスレッショルド範囲

浮動小数点フォーマット バイアスされていないオーバーフロー・スレッショルド範囲

単精度 -1.0 * 21281.0 * 2128(両端の値を含まない)

倍精度 -1.0 * 210241.0 * 21024(両端の値を含まない)

拡張倍精度 -1.0 * 2163841.0 * 216384(両端の値を含まない)

表4-10. 数値オーバーフローに対するマスク応答

丸めモード 真の結果の符号 結果

最近値 + +∞

–∞

–∞方向 + 正の最大有限数。

–∞

+∞方向 + +∞

負の最大有限数。

ゼロ方向 + 正の最大有限数。

負の最大有限数。

数値オーバーフローが発生し、数値オーバーフロー例外がマスクされていない場合は、OEフラグが セットされ、ソフトウェア例外ハンドラが起動される。オーバーフロー例外がSSEまたはSSE2浮動 小数点演算で発生した場合は、ソース・オペランドとデスティネーション・オペランドはどちらも 変更されない。オーバーフロー例外がx87 FPU演算で発生した場合は、バイアスされた結果がデス ティネーション・オペランドに格納される。

x87 FPU命令、またはSSE、SSE2の実行中に検出される数値オーバーフロー例外については、以下

の各項を参照のこと。

x87 FPU:8.5.4.項 「数値オーバーフロー例外 (#O)」

SIMD浮動小数点例外:11.5.2.4.「数値オーバーフロー例外(#O)」

4.9.1.5. 数値アンダーフロー例外(#U)

算術命令の丸められた結果が極小数(すなわち、デスティネーション・オペランドの有効範囲内で最 も小さいノーマル型有限値より小さい値)になった場合、プロセッサは浮動小数点数値アンダーフ ロー例外を検出する。表4-11.は、各浮動小数点フォーマットについて、数値アンダーフローのス レッショルド範囲を示している。丸められた結果がバイアスされていない数値でこのスレッショル ド範囲内(両端の値を除く)に入った場合に、アンダーフローが発生する。アンダーフローを検出し て処理する機能は、非常に小さい結果が計算によって伝搬され、その後で他の例外(除算時のオー バーフローなど)を発生させるのを防ぐために用意されている。

プロセッサがアンダーフロー条件をどのように処理するかは、それに関連する次の2つの条件によっ て異なる。

極小の結果の発生。

不正確結果の発生。すなわち、演算結果がデスティネーション・フォーマットで正確に表現で きない場合。

どのイベントでアンダーフロー例外が報告されるか、またプロセッサがアンダーフロー例外条件に どのように応答するかは、アンダーフロー例外がマスクされているかどうかによって異なる。

アンダーフロー例外がマスクされている場合。計算の結果が極小かつ不正確である場合にのみ、

アンダーフロー例外が報告される(UEフラグがセットされる)。結果が不正確かどうかに関係な く、プロセッサはデスティネーション・オペランドにデノーマル型の結果を返す。

アンダーフロー例外がマスクされていない場合。結果が不正確であるかどうかに関係なく、結 果が極小である場合に、アンダーフロー例外が報告される。アンダーフロー例外がSSEまたは SSE2浮動小数点演算で発生した場合は、ソース・オペランドとデスティネーション・オペラン ドは変更されない。アンダーフロー例外がx87 FPU演算で発生した場合は、バイアスされた結 果がデスティネーション・オペランドに格納される。いずれの場合も、ソフトウェア例外ハン ドラが起動される。

表4-11. 数値アンダーフローのスレッショルド範囲

浮動小数点フォーマット バイアスされていないアンダーフロー・スレッショルド範囲

単精度 -1.0 * 2-1261.0 * 2-126(両端の値を除く)

倍精度 -1.0 * 2-10221.0 * 2-1022(両端の値を除く)

拡張倍精度 -1.0 * 2-163821.0 * 2-16382(両端の値を除く)

x87 FPU命令、またはSSE、SSE2の実行中に検出される数値アンダーフロー例外については、以下 の各項を参照のこと。

x87 FPU:8.5.4.項 「数値オーバーフロー例外 (#O)」

SIMD浮動小数点例外:11.5.2.5.「数値アンダーフロー例外(#U)」

4.9.1.6. 不正確結果(精度)例外 (#P)

不正確結果例外(精度例外とも呼ばれる)は、演算の結果がデスティネーション・フォーマットで 正確に表現できない場合に発生する。たとえば、分数1/3は2進浮動小数点形式では正確には表現で きない。この例外は頻繁に発生し、精度に多少のロス(通常は許容できる範囲内)が生じたことを 示す。この例外は、正確な演算を実行する必要があるアプリケーションに対してだけサポートされ る。丸められた結果は、一般的に大部分のアプリケーションにとって満足できるものであるため、こ の例外はマスクされることが多い。

不正確結果条件が発生したときに不正確結果例外がマスクされており、しかも数値オーバーフロー またはアンダーフローのいずれの条件も発生していない場合は、プロセッサはPEフラグをセットし、

丸められた結果をデスティネーション・オペランドに格納する。結果の丸めに使用される方法は、現 在の丸めモードによって決まる(4.8.4.項 「丸め」を参照)。

不正確な結果が発生したときに不正確結果例外がマスクされておらず、数値オーバーフローも数値 アンダーフローも発生しなかった場合は、PEフラグがセットされ、丸められた結果がデスティネー ション・オペランドに格納され、ソフトウェア例外ハンドラが起動される。

数値オーバーフローまたは数値アンダーフローと同時に不正確結果例外が発生した場合は、次の操 作のいずれかが実行される。

不正確結果が、マスクされているオーバーフローまたはアンダーフローと一緒に発生した場合 は、OEフラグとUEフラグのいずれかとPEフラグがセットされ、さらにオーバーフロー例外や アンダーフロー例外で説明した方法で結果が格納される(4.9.1.4.項 「数値オーバーフロー例外

(#O)」と4.9.1.5.項 「数値アンダーフロー例外(#U)」」を参照)。不正確結果例外がマスクされて

いない場合は、プロセッサはソフトウェア例外ハンドラも呼び出す。

不正確結果が、マスクされていないオーバーフローまたはアンダーフローと一緒に発生し、しか もデスティネーション・オペランドがレジスタである場合は、OEフラグとUEフラグのいずれか とPEフラグがセットされ、さらにオーバーフロー例外やアンダーフロー例外で説明した方法で結 果が格納される。また、ソフトウェア例外ハンドラが呼び出される。

(マスクされていないか、またはマスクされている)不正確結果例外が、マスクされていない数 値オーバーフロー例外またはアンダーフロー例外とともに発生し、デスティネーション・オペ ランドがメモリ・ロケーションである場合は(これは浮動小数点のストアの場合に限られる)、

不正確結果条件は無視される。

x87 FPU命令、またはSSE、SSE2の実行中に検出される不正確例外については、以下の各項を参照

のこと。

x87 FPU:8.5.6.項 「不正確結果(精度)例外 (#P)」

SIMD浮動小数点例外:11.5.2.6.項 「不正確結果(精度)例外(#P)」