分享方式:


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 | 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_controlpragma的行為與編譯程序選項不同/fpfloat_controlpragma唯一會控管浮點行為的一部分。 它必須與 和 fenv_accesspragma 指示詞結合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_controlfenv_access 浮點 pragma 指示詞的方式有一些限制:

  • 只有在啟用精確的語意時,您才能使用 float_control 設定excepton為 。 您可以使用 或 /fp:precise /fp:strict 編譯程式選項來啟用float_controlpragma精確的語意。

  • 不論是否由 float_control或 編譯程式選項啟用例外狀況語意,您都無法使用 float_control 來關閉precise/fp:exceptpragma

  • 除非藉由 float_controlpragma 或 編譯程式選項啟用精確的語意,否則您無法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_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使用來關閉preciseexcept還原先前的合約設定。 您可以使用 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(&currentControl, ~_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