指定函式的浮點行為。
語法
#pragma float_control
#pragma float_control( precise,{on|off} [, push])
#pragma float_control( except,{on|off} [, push])
#pragma float_control({push|pop})
選項。
precise、 、 on | offpush
指定是否要啟用 (on) 或停用 (off) 精確的浮點語意。 如需編譯 /fp:precise 程式選項差異的詳細資訊,請參閱一節。 選擇性 push 令牌會在內部編譯程式堆疊上推送 的目前設定 float_control 。
except、 、 on | offpush
指定是否啟用 (on) 或停用 (off) 浮點例外狀況語意。 選擇性 push 令牌會在內部編譯程式堆疊上推送 的目前設定 float_control 。
except 只有在 設定 on 為時 precise ,才能設定為 on。
push
將目前的 float_control 設定推送至內部編譯程式堆疊。
pop
float_control從內部編譯程式堆疊頂端移除設定,並讓該設定成為新的float_control設定。
備註
float_control
pragma的行為與編譯程序選項不同/fp。
float_control
pragma唯一會控管浮點行為的一部分。 它必須與 和 fp_contractfenv_access 指示詞結合pragma,才能重新建立/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設定excepton為 。 您可以使用 或float_controlpragma 編譯程式選項來啟用/fp:precise/fp:strict精確的語意。不論是否由
float_control或 編譯程式選項啟用例外狀況語意,您都無法使用precise來關閉float_control。pragma/fp:except除非藉由
fenv_accessfloat_control或 編譯程式選項啟用精確的語意,否則您無法pragma啟用。開啟時
float_control,您無法使用precise關閉fenv_access。
這些限制表示某些浮點 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_controlpragma從嚴格模型移至快速模型,請使用下列程序代碼:
#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_contractpragma 指示詞來變更合約上的編譯程序行為。
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