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