float_control
関数の浮動小数点動作を指定します。
float_control( value,setting [push] | push | pop )
フラグ
value , setting [push]
浮動小数点の動作を指定します。 value には、precise または except を指定できます。 詳細については、「/fp (浮動小数点の動作の指定)」を参照してください。 setting は、on または off に設定できます。value が precise の場合、precise と except の設定が指定されています。 except は、precise も on に設定されている場合のみ on に設定できます。
オプションの push トークンを追加すると、value の現在の設定が内部コンパイラ スタックにプッシュされます。
push
現在の float_control 設定を内部コンパイラ スタックにプッシュします。pop
内部コンパイラ スタックの最上部からfloat_control 設定を削除し、それを新しい float_control 設定にします。
解説
except がオンの場合は、float_control precise をオフにすることはできません。 同様に、fenv_access がオンになっている場合は、precise をオフにすることはできません。 float_control プラグマを使用して厳格なモデルから高速モデルに移行するには、次のコードを使用します。
#pragma float_control(except, off)
#pragma fenv_access(off)
#pragma float_control(precise, off)
// The following line is needed on Itanium processors
#pragma fp_contract(on)
float_control プラグマを使用して高速モデルから厳格なモデルに移行するには、次のコードを使用します。
#pragma float_control(precise, on)
#pragma fenv_access(on)
#pragma float_control(except, on)
// The following line is needed on Itanium processors.
#pragma fp_contract(off)
その他の浮動小数点プラグマには以下があります。
使用例
次のサンプルは、float_control プラグマを使用してオーバーフロー浮動小数点例外をキャッチする方法を示しています。
// pragma_directive_float_control.cpp
// compile with: /EHa
#include <stdio.h>
#include <float.h>
double func( ) {
return 1.1e75;
}
#pragma float_control (except,on)
int main( ) {
float u[1];
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, ~_EM_OVERFLOW, _MCW_EM);
if (err != 0)
printf_s("_controlfp_s failed!\n");
try {
u[0] = func();
printf_s ("Fail");
return(1);
}
catch (...) {
printf_s ("Pass");
return(0);
}
}