/fp (浮動小数点の動作の指定)
更新 : 2007 年 11 月
ソース コード ファイルの浮動小数点の動作を指定します。
/fp:[precise | except[-] | fast | strict ]
フラグ
precise
これが既定値です。浮動小数点演算の精度に影響する最適化処理を無効にし、演算結果が一致するかどうかを判定する浮動小数点テストの一貫性を向上させます。これは、ANSI 基準に厳密に従う場合に要求されます。既定では、浮動小数点演算の中間結果は、コプロセッサの 80 ビット レジスタに保持されます。これにより、プログラムの実行速度が向上し、プログラムのサイズも小さくなります。浮動小数点演算では、80 ビット未満のメモリで表される浮動小数点データ型も使用されます。したがって、処理内容の多い演算では、このように余分な精度ビット (つまり、80 ビットと実際の浮動小数点データ型のビット数との差) があると、演算結果の一貫性が失われることがあります。
x86 プロセッサの /fp:precise では、コンパイラはパラメータを関数に渡すときに float 型の変数の有効桁数を丸め、適切な割り当ておよびキャストが行われるようにします。この丸めにより、データが型の容量を大幅に上回らないようにします。/fp:precise でコンパイルされたプログラムは、/fp:precise を使用せずにコンパイルされたプログラムよりも処理速度が遅く、サイズも大きくなります。/fp:precise は組み込みを無効にするため、代わりに標準のランタイム ライブラリ ルーチンが使用されます。詳細については、「/Oi (組み込み関数の生成)」を参照してください。
浮動小数点の動作は /fp:precise で有効にします。
最後に丸め操作を 1 回だけ実行し、短縮形または複数の演算を 1 つの複合演算へ置き換える操作は、/fp:precise で有効にします。
特殊な値 (NaN、+infinity、-infinity、+0、-0) に対して無効な式の最適化は使用できません。最適化 x-x => 0、x*0 => 0、x-0 => x、x+0 => x、および 0-x => -x は、さまざまな理由によりすべて無効です。詳細については、IEEE 754 および C99 標準を参照してください。
コンパイラは、NaN が含まれている比較を適切に処理します。たとえば、x が NaN の場合、x != x は true になり、NaN が含まれている順序比較では例外が発生します。
式の評価は C99 FLT_EVAL_METHOD=2 に従いますが、1 つだけ例外があります。x86 プロセッサに対するプログラミングでは、FPU は 53 ビット精度に設定されるため long double 精度と見なされます。
厳密な 1.0 での乗算では他の係数に変換されます。たとえば、x*y*1.0 は x*y になります。同じように、x*1.0*y は x*y になります。
厳密な 1.0 での除算では被除数が使用されます。たとえば、x*y/1.0 は x*y になります。同じように、x/1.0*y は x*y になります。
fenv_access を ON にして /fp:precise を使用すると、浮動小数点式のコンパイル時間の評価などの一部の最適化が無効になります。たとえば、_control87、_controlfp、__control87_2 を指定して丸めモードを変更した場合、コンパイラは浮動小数点を計算しますが、指定した丸めモードは fenv_access が ON になるまでは無効です。
/fp:precise は /Op コンパイラ オプションを置き換えます。
fast
ほとんどの場合、最高速のコードを作成します。/fp:fast は /fp:strict または /fp:precise と併用できません。コマンド ラインに指定された最後のオプションが使用されます。/fp:fast および /fp:except はコンパイラ エラーを生成します。/Za、/Ze (言語拡張機能の無効化) (ANSI 互換性) と /fp:fast を選択すると、予期しない動作が発生することがあります。たとえば、単精度の浮動小数点演算が単精度に丸められない場合があります。
except[-]
信頼性の高い浮動小数点例外モデル。例外は発生直後にスローされます。このオプションの既定値はオフです。オプションにマイナス記号を付けると、オプションは明示的に無効になります。strict
厳密な浮動小数点モデル。/fp:strict は fp_contract を OFF にし、fenv_access を ON にします。/fp:except は暗黙に指定され、/fp:except- を指定して明示的に無効にできます。/fp:except- を使用する場合、/fp:strict は厳密な浮動小数点のセマンティクスを適用しますが、例外イベントは無視します。
解説
1 つのコンパイルで複数の /fp オプションを指定できます。
浮動小数点の動作を関数で制御するには、「float_control プラグマ」を参照してください。
浮動小数点の最適化のほとんどは /fp:strict、/fp:except、およびそれに対応するプラグマに関連しており、fp_contract プラグマはマシンに依存しています。/fp:strict と /fp:except は /clr と互換性がありません。
/fp:precise は、アプリケーションのほとんどの浮動小数点要件に対応します。必要に応じて /fp:except および /fp:strict を使用できますが、パフォーマンスが低下する場合があります。パフォーマンスが最も重要である場合は、/fp:fast を使用してください。
/fp:strict、/fp:fast、および /fp:precise は精密 (正確) なモードです。一度に 1 つのモードだけを使用できます。/fp:strict と /fp:precise が指定されている場合、コンパイラは最後に処理した方を使用します。/fp:strict と /fp:fast の両方を指定することはできません。
詳細については、https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/floapoint.asp を参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[構成プロパティ] ノードを展開します。
[C/C++] ノードを展開します。
[コード生成] プロパティ ページを選択します。
[浮動小数点モデル] プロパティを変更します。
このコンパイラ オプションをコードから設定するには
- floatingPointModel を参照してください。