float_control
pragma
指定函式的浮點行為。
語法
#pragma float_control
#pragma float_control( precise,
{on
|off
} [, push
])
#pragma float_control( except,
{on
|off
} [, push
])
#pragma float_control(
{push
|pop
})
選項。
precise
、 、 on
| off
push
指定是否要啟用 (on
) 或停用 (off
) 精確的浮點語意。 如需編譯 /fp:precise
程式選項差異的詳細資訊,請參閱一節。 選擇性 push
令牌會在內部編譯程式堆疊上推送 的目前設定 float_control
。
except
、 、 on
| off
push
指定是否啟用 (on
) 或停用 (off
) 浮點例外狀況語意。 選擇性 push
令牌會在內部編譯程式堆疊上推送 的目前設定 float_control
。
except
只有在 設定 on
為時 precise
,才能設定為 on
。
push
將目前的 float_control
設定推送至內部編譯程式堆疊。
pop
float_control
從內部編譯程式堆疊頂端移除設定,並讓該設定成為新的float_control
設定。
備註
float_control
pragma的行為與編譯程序選項不同/fp
。 float_control
pragma唯一會控管浮點行為的一部分。 它必須與 和 fenv_access
pragma 指示詞結合fp_contract
,才能重新建立/fp
編譯程序選項。 下表顯示每個編譯程式選項的對等 pragma 設定:
選項 | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off * |
off |
/fp:fast |
off |
off |
on |
off |
* 在 Visual Studio 2022 之前的 Visual Studio 版本中, /fp:precise
行為預設為 fp_contract(on)
。
選項 | float_control(precise, *) |
float_control(except, *) |
fp_contract(*) |
fenv_access(*) |
---|---|---|---|---|
/fp:strict |
on |
on |
off |
on |
/fp:precise |
on |
off |
off |
off |
/fp:fast |
off |
off |
on |
off |
換句話說,您可能需要組合使用數 pragma 個指示詞來模擬 /fp:fast
、 /fp:precise
和 /fp:strict
命令行選項。
結合使用 float_control
和 fenv_access
浮點 pragma 指示詞的方式有一些限制:
只有在啟用精確的語意時,您才能使用
float_control
設定except
on
為 。 您可以使用 或/fp:precise
/fp:strict
編譯程式選項來啟用float_control
pragma精確的語意。不論是否由
float_control
或 編譯程式選項啟用例外狀況語意,您都無法使用float_control
來關閉precise
。/fp:except
pragma除非藉由
float_control
pragma 或 編譯程式選項啟用精確的語意,否則您無法fenv_access
啟用。開啟時
fenv_access
,您無法使用float_control
關閉precise
。
這些限制表示某些浮點 pragma 指示詞的順序相當重要。 若要從快速模型移至使用 pragma 指示詞的嚴格模型,請使用下列程序代碼:
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma float_control(precise, on) // enable precise semantics
#pragma fenv_access(on) // enable environment sensitivity
#pragma float_control(except, on) // enable exception semantics
#pragma fp_contract(off) // disable contractions
若要使用 float_control
pragma從嚴格模型移至快速模型,請使用下列程序代碼:
#pragma float_control(except, off) // disable exception semantics
#pragma fenv_access(off) // disable environment sensitivity
#pragma float_control(precise, off) // disable precise semantics
#pragma fp_contract(on) // enable contractions
如果未指定任何選項, float_control
則沒有任何作用。
指示 float_control
詞會在 precise
開啟 或 except
時停用收縮。 float_control
使用來關閉precise
或except
還原先前的合約設定。 您可以使用 fp_contract
pragma 指示詞來變更合約上的編譯程序行為。 float_control(push)
並將 float_control(pop)
合約的設定推送並彈出,做為內部編譯程式堆疊設定的 float_control
一部分。 此行為是Visual Studio 2022的新功能。 float_control
舊版編譯程式中的指示詞不會影響合約設定。
範例
下列範例示範如何使用 攔截溢位浮點例外狀況 pragmafloat_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);
}
}
Pass
另請參閱
Pragma 指示詞和 __pragma
和 _Pragma
關鍵詞
fenv_access
pragma
fp_contract
pragma