共用方式為


fenv_access

(開啟) 會停用或啟用 (關閉),都可以變更旗標的測試和模式變更最佳化。

#pragma fenv_access [ON | OFF]

備註

預設情況下, fenv_access為 OFF。

如需有關浮點數行為的詳細資訊,請參閱/fp (指定浮點數行為)

最佳化那些取決於種fenv_access是:

  • 全域通用子運算式刪除

  • 程式碼影片

  • 將常數摺疊

其他的浮點 pragma 包括:

範例

// pragma_directive_fenv_access_x86.cpp
// compile with: /O2
// 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(&currentControl, _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);
}
  

下列範例會產生 Itanium 處理器的輸出檔的編譯器。 /fp:precise延伸精確度將保留中繼結果,大於 FLT_MAX 的值 (3.402823466 e + 38F) 可計算和結果的總和就必須 1.0 的結果,如果以手動方式計算無誤。 /fp:strict所以第一個加入產生無限值,會保留在整個運算式,會保留具有中等其來源的整數位數 (float) 的結果。

// pragma_directive_fenv_access_IPF.cpp
// compile with: /O2 /fp:precise
// processor: IPF
// compiling with /fp:precise prints 1.0F
// compile with /fp:strict to print infinity

#include <stdio.h>
float arr[5] = {3.402823465e+38F, 
               3.402823462e+38F,
               3.402823464e+38F,
               3.402823463e+38F,
               1.0F};

int main() {
   float sum = 0;
   sum = arr[0] + arr[1] - arr[2] - arr[3] + arr[4];
   printf_s("%f\n", sum);
}
  

標記為註解時#pragma fenv_access (on)從先前的範例中,請注意輸出是不同,因為編譯器不會產生編譯時期評估,並不會使用控制項模式。

// pragma_directive_fenv_access_2.cpp
// compile with: /O2
#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(&currentControl, _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);
}
  

請參閱

參考

Pragma 指示詞 」 和 「 __Pragma 關鍵字