名稱空間
變體
操作

FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD

來自 cppreference.com
< cpp‎ | 數值‎ | fenv
 
 
 
浮點環境
函式
(C++11)(C++11)
(C++11)(C++11)
宏常量
FE_DOWNWARDFE_TONEARESTFE_TOWARDZEROFE_UPWARD
(C++11)(C++11)(C++11)(C++11)
(C++11)
 
定義於標頭檔案 <cfenv>
#define FE_DOWNWARD     /*implementation defined*/
(C++11 起)
#define FE_TONEAREST    /*implementation defined*/
(C++11 起)
#define FE_TOWARDZERO   /*implementation defined*/
(C++11 起)
#define FE_UPWARD       /*implementation defined*/
(C++11 起)

這些宏常量中的每一個都擴充套件為一個非負整數常量表達式,可與 std::fesetroundstd::fegetround 一起使用,以指示所支援的浮點舍入模式之一。實現可以在 <cfenv> 中定義額外的舍入模式常量,它們都應該以 FE_ 後跟至少一個大寫字母開頭。每個宏僅在其受支援時才被定義。

常量 解釋
FE_DOWNWARD 向負無窮大舍入
FE_TONEAREST 向最接近的可表示值舍入
FE_TOWARDZERO 向零舍入
FE_UPWARD 向正無窮大舍入

實現可能支援額外的舍入模式。

當前舍入模式影響以下內容:

double x = 1;
x / 10; // 0.09999999999999999167332731531132594682276248931884765625
     // or 0.1000000000000000055511151231257827021181583404541015625
std::sqrt(2); // 1.41421356237309492343001693370752036571502685546875
           // or 1.4142135623730951454746218587388284504413604736328125
  • 浮點到浮點隱式轉換和型別轉換
double d = 1 + std::numeric_limits<double>::epsilon();
float f = d; // 1.00000000000000000000000
          // or 1.00000011920928955078125
std::stof("0.1"); // 0.0999999940395355224609375
               // or 0.100000001490116119384765625
std::lrint(2.1); // 2 or 3

當前舍入模式不影響以下內容:

與任何浮點環境功能一樣,只有在設定 #pragma STDC FENV_ACCESS ON 時才能保證舍入。

不支援該 pragma 的編譯器可能會提供自己的方式來支援當前舍入模式。例如,Clang 和 GCC 有一個選項 -frounding-math,旨在停用會改變舍入敏感程式碼含義的最佳化。

[編輯] 示例

#include <cfenv>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <string>
// #pragma STDC FENV_ACCESS ON
 
int main()
{
    std::fesetround(FE_DOWNWARD);
    std::cout << "rounding down: \n" << std::setprecision(50)
              << "         pi = " << std::acos(-1.f) << '\n'
              << "stof(\"1.1\") = " << std::stof("1.1") << '\n'
              << "  rint(2.1) = " << std::rint(2.1) << "\n\n";
    std::fesetround(FE_UPWARD);
    std::cout << "rounding up: \n"
              << "         pi = " << std::acos(-1.f) << '\n'
              << "stof(\"1.1\") = " << std::stof("1.1") << '\n'
              << "  rint(2.1) = " << std::rint(2.1) << '\n';
}

輸出

rounding down:
         pi = 3.141592502593994140625
stof("1.1") = 1.099999904632568359375
  rint(2.1) = 2
 
rounding up:
         pi = 3.1415927410125732421875
stof("1.1") = 1.10000002384185791015625
  rint(2.1) = 3

[編輯] 另請參閱

指示浮點舍入模式
(列舉) [編輯]
(C++11)(C++11)
獲取或設定舍入方向
(函式) [編輯]
C 文件,關於浮點舍入宏