-fp-model (Linux* および Mac OS* X) または /fp (Windows*) オプションは、浮動小数点データの最適化を制御します。このオプションを使用して、プラットフォーム間や最適化レベルにおいて浮動小数点アプリケーションのパフォーマンス、精度、 出力結果の一貫性を調整できます。
デノーマル数のサポートが必要ないアプリケーションでは、-fp-model または /fp オプションを、-ftz (Linux および Mac OS X) あるいは /Qftz (Windows) オプションにともに使用してデノーマル結果をゼロにフラッシュし、すべてのインテル® アーキテクチャー (IA-32、インテル® 64、IA-64 アーキテクチャー) 上でランタイム・パフォーマンスを向上させることができます。
キーワードで、使用するセマンティクスを指定します。指定できる値は次のとおりです。
キーワード |
説明 |
---|---|
precise |
浮動小数点データの精度に影響しない最適化を有効にし、中間結果をソースで定義された精度まで丸めます。 |
fast[=1|2] |
浮動小数点データにより強力な最適化を有効にします。 |
strict |
precise と except を有効にし、縮約を無効にし、浮動小数点環境の変更を可能にするプロパティーを有効にします。 |
source |
浮動小数点データの精度に影響しない最適化を有効にし、中間結果をソースで定義された精度まで丸めます (precise キーワードと同じです)。 |
[no-]except (Linux および Mac OS X) または |
厳密な浮動小数点例外セマンティクスを使用するかどうかを決定します。 |
このオプションのデフォルトは、-fp-model fast=1 または /fp:fast=1 です。コンパイラーは、浮動小数点演算により強力な最適化を使用します。
デフォルトのオプションキーワード -fp-model fast または /fp:fast を使用すると、浮動小数点演算を実装するべくコンパイラーが x87 または SSE2 命令を使用するかどうかによって、結果に大きな差異が発生することがあります。別のオプションキーワードを使用する場合、結果はより一定になります。
以下にキーワードの使用方法の例をいくつか示します。例には次の点が含まれます。
ソースコード例
同じソースコードがすべての例で使用されることに注意してください。
ソースコードで浮動小数点演算の解釈に適用されるセマンティクス
コンパイラーによるソースコードの解釈方法
コンパイラーによるソースコードの解釈方法は、複数ある可能性がありますが、例ではその一部を紹介します。
ソースコード例:
REAL T0, T1, T2;
...
T0 = 4.0E + 0.1E + T1 + T2;
このオプションが指定されると、コンパイラーは次のセマンティクスを適用します。
次の例は、これらのセマンティクスを使用して、コンパイラーがオリジナルのコードを解釈する方法を示しています。
REAL T0, T1, T2;
...
T0 = (T1 + T2) + 4.1E;
REAL T0, T1, T2;
...
T0 = (T1 + 4.1E) + T2;
これは、インテル® 64 アーキテクチャー・ベース・システムの -fp-model precise または /fp:precise に相当します。
ソースコード例:
REAL T0, T1, T2;
...
T0 = 4.0E + 0.1E + T1 + T2;
このオプションが指定されると、コンパイラーは次のセマンティクスを適用します。
次の例は、これらのセマンティクスを使用して、コンパイラーがオリジナルのコードを解釈する方法を示しています。
REAL T0, T1, T2;
...
T0 = ((4.1E + T1) + T2);
ソースコード例:
REAL T0, T1, T2;
...
T0 = 4.0E + 0.1E + T1 + T2;
このオプションが指定されると、コンパイラーは次のセマンティクスを適用します。
プログラムの順序で加算が行われます。
中間式は常に fast ではなく、source 精度を使用します。
プログラム実行時にどの丸めモードがアクティブかを指示する方法がないため、定数の追加は、事前計算されません。
次の例は、これらのセマンティクスを使用して、コンパイラーがオリジナルのコードを解釈する方法を示しています。
REAL T0, T1, T2;
...
T0 = REAL ((((REAL)4.0E + (REAL)0.1E) + (REAL)T1) + (REAL)T2);