fenv_access
pragma
停用 (on
) 或啟用off
() 優化,以變更浮點環境旗標測試和模式變更。
語法
#pragma fenv_access (
{on
|off
})
備註
根據預設,fenv_access
是 off
。 編譯程式假設您的程式代碼無法存取或操作浮點環境。 如果不需要環境存取,編譯程式可以執行更多動作來優化浮點程序代碼。
fenv_access
如果您的程式代碼測試浮點狀態旗標、例外狀況或設定控制模式旗標,請啟用 。 編譯程式會停用浮點優化,因此您的程式代碼可以一致地存取浮點環境。
/fp:strict
命令列選項會自動啟用 fenv_access
。 如需此行為和其他浮點行為的詳細資訊,請參閱 /fp (指定浮點行為)。
您可以搭配其他浮點設定使用 fenv_access
pragma 的方式有一些限制:
除非啟用精確的語意,否則您無法
fenv_access
啟用。 您可以使用 或/fp:precise
/fp:strict
編譯程式選項來啟用float_control
pragma精確的語意。 如果未指定其他浮點命令列選項,編譯程式會預設/fp:precise
為 。設定時
fenv_access(on)
,您無法使用float_control
來停用精確的語意。
指示fenv_access(on)
詞會停用產生浮點合約、結合浮點作業的電腦指令。 fenv_access(off)
會還原先前的合約行為。 此行為是Visual Studio 2022的新功能。 舊版編譯程序預設可能會在下 fenv_access(on)
產生合約。 如需浮點收縮的詳細資訊,請參閱 /fp:contract
。
受限 fenv_access
於的優化類型如下:
全域通用子運算式刪除
程式碼移動
常數摺疊
其他浮點 pragma 指示詞包括:
範例
本範例會將 設定 fenv_access
為 on
,以設定 24 位精確度的浮點控件快取器:
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2 /arch:IA32
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=9.999999776482582e-03
如果您將先前的範例批注化 #pragma fenv_access (on)
,輸出會有所不同。 這是因為編譯程式會進行編譯時間評估,而該評估不會使用控件模式。
// pragma_directive_fenv_access_2.cpp
// compile with: /O2 /arch:IA32
#include <stdio.h>
#include <float.h>
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=1.000000000000000e-02