Share via


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_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