FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD
|
Определено в заголовочном файле
<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 // или 0.1000000000000000055511151231257827021181583404541015625
- результаты стандартной библиотеки математических функций
std::sqrt(2); // 1.41421356237309492343001693370752036571502685546875 // или 1.4142135623730951454746218587388284504413604736328125
- Неявное преобразование и приведение типов с плавающей запятой к типам с плавающей запятой
double d = 1 + std::numeric_limits<double>::epsilon(); float f = d; // 1.00000000000000000000000 // или 1.00000011920928955078125
- преобразования строк, такие как std::strtod или std::printf
std::stof("0.1"); // 0.0999999940395355224609375 // или 0.100000001490116119384765625
- библиотечные функции округления std::nearbyint , std::rint , std::lrint
std::lrint(2.1); // 2 или 3
Текущий режим округления НЕ влияет на следующее:
- неявное преобразование и приведения плавающей точки к целому числу (всегда в сторону нуля),
- результаты арифметических операторов с плавающей точкой в выражениях, выполняемых во время компиляции (всегда к ближайшему),
- библиотечные функции std::round , std::lround , std::llround , std::ceil , std::floor , std::trunc .
Как и в случае с любой функциональностью среды с плавающей запятой , округление гарантируется только если установлена #pragma STDC FENV_ACCESS ON .
Компиляторы, не поддерживающие прагму, могут предлагать собственные способы поддержки текущего режима округления. Например, 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 << "округление вниз: \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 << "округление вверх: \n" << " pi = " << std::acos(-1.f) << '\n' << "stof(\"1.1\") = " << std::stof("1.1") << '\n' << " rint(2.1) = " << std::rint(2.1) << '\n'; }
Вывод:
округление вниз:
pi = 3.141592502593994140625
stof("1.1") = 1.099999904632568359375
rint(2.1) = 2
округление вверх:
pi = 3.1415927410125732421875
stof("1.1") = 1.10000002384185791015625
rint(2.1) = 3
Смотрите также
|
указывает режимы округления чисел с плавающей точкой
(перечисление) |
|
|
(C++11)
(C++11)
|
получает или устанавливает направление округления
(функция) |
|
Документация C
для
макросов округления чисел с плавающей точкой
|
|