float_control
関数に浮動小数点の動作を指定します。
float_control( value,setting [push] | push | pop )
Flags
value,setting**[push]**
浮動小数点の動作を指定します。value は precise または except を指定できます。詳細については、「/fp (浮動小数点の動作の指定)」を参照してください。setting です on または off できます。value が precise 場合precise と except の設定が指定されています。except は on に precise が on に設定をに設定するだけです。
push のオプションのトークンを追加するとvalue の現在の設定がコンパイラの内部スタックにプッシュされます。
push
コンパイラの内部スタックに設定して現在の float_control を押します。pop
コンパイラの内部スタックの最上位から設定する float_control を削除しfloat_control の新しいセットを作成します。
解説
except がオンの場合 float_control precise をからに変更することはできません。同様にprecise は fenv_access をオンにするとオフを切り替えることはできません。厳密なモデルから 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);
}
}