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
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應