浮動小数点演算の精度の向上と制限

-mp および -mp1 オプションは、それぞれ浮動小数点精度を維持および制限しますがアプリケーションのパフォーマンスに影響します。-mp1 オプションは、-mp オプションよりもパフォーマンスに及ぼす影響は少ないです。-mp1 では、超越関数のオペランドの範囲外チェックを実現し、浮動小数点演算の比較精度を向上させます。IA-32 システムの場合、-mp オプションは -mp1 を含意し、-mp1 オプションは -fp_port を含意します。  -mp を使用するとパフォーマンスが最も低下し、-fp_port を使用するとパフォーマンス低下を最小限に抑えられます。

-mp オプションを指定すると、精度は宣言された水準が保たれます。また、浮動小数点演算の処理は、ANSI および IEEE* 標準にほぼ準拠する結果となります。このオプションを使用すると、メモリへの頻繁な保存や、または一部のデータのレジスタ割り当て失敗が発生します。インテル® アーキテクチャは、 通常、浮動小数点結果をレジスタに維持します。これらのレジスタは、80 ビット長で、倍精度の数よりも大きな精度を保ちます。結果をメモリに保存する必要がある場合は、丸めが起こります。これで、「予測される」精度の結果を得ることができますが、速度が遅くなります。 -pc{32|64|80} オプション (IA-32 のみ) は、さまざまなプロセッサの IEEE フラグに合わせて、浮動小数点の精度および丸めを制御するのに使用されます。

ほとんどのプログラムでは、-mp オプションを指定するとパフォーマンスの低下につながります。目的のアプリケーションにこのオプションが必要かどうかよくわからない場合は、このオプションを指定した場合と指定しない場合で実際にプログラムをコンパイルし、実行して、パフォーマンスと精度に対する効果を評価してみてください。

このオプションを指定すると、プログラムのコンパイルに次の影響が生じます:

IA-32 システムでは、式がスピルする場合、64 ビット (DOUBLE PRECISION) ではなく、80 ビット (extended precision) としてスピルされます。浮動小数点演算は、IEEE 754 に準拠します。REAL 型および DOUBLE PRECISION 型への代入を行うと、その精度は、80 ビット (extended) から 32 ビット (REAL) か 64 ビット (DOUBLE PRECISION) に丸められます。-O0 を指定しなければ、精度が丸められずに変数が再使用される場合もあります。