FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD
來自 cppreference.com
定義於標頭檔案 <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::fesetround 和 std::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::strtod 或 std::printf
std::stof("0.1"); // 0.0999999940395355224609375 // or 0.100000001490116119384765625
- 庫舍入函式 std::nearbyint, std::rint, std::lrint
std::lrint(2.1); // 2 or 3
當前舍入模式不影響以下內容:
- 浮點到整數的隱式轉換和型別轉換(始終向零舍入),
- 在編譯時執行的表示式中浮點算術運算子的結果(始終向最近舍入),
- 庫函式 std::round, std::lround, std::llround, std::ceil, std::floor, std::trunc。
與任何浮點環境功能一樣,只有在設定 #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 文件,關於浮點舍入宏
|