std::numeric_limits<T>::round_style
static const std::float_round_style round_style; |
(до C++11) | |
static constexpr std::float_round_style round_style; |
(с C++11) |
Значение std::numeric_limits<T>::round_style определяет стиль округления, используемый типом с плавающей точкой T, когда значение, не являющееся точно представимым значением T, сохраняется в объекте этого типа.
Стандартные специализации
T |
значение std::numeric_limits<T>::round_style |
|---|---|
| /* неспециализированный */ | std::round_toward_zero |
| bool | std::round_toward_zero |
| char | std::round_toward_zero |
| signed char | std::round_toward_zero |
| unsigned char | std::round_toward_zero |
| wchar_t | std::round_toward_zero |
| char8_t (с C++20) | std::round_toward_zero |
| char16_t (с C++11) | std::round_toward_zero |
| char32_t (с C++11) | std::round_toward_zero |
| short | std::round_toward_zero |
| unsigned short | std::round_toward_zero |
| int | std::round_toward_zero |
| unsigned int | std::round_toward_zero |
| long | std::round_toward_zero |
| unsigned long | std::round_toward_zero |
| long long (с C++11) | std::round_toward_zero |
| unsigned long long (с C++11) | std::round_toward_zero |
| float | обычно std::round_to_nearest |
| double | обычно std::round_to_nearest |
| long double | обычно std::round_to_nearest |
Примечания
Эти значения являются константами и не отражают изменения в округлении, произведенные std::fesetround. Изменённые значения можно получить из FLT_ROUNDS или std::fegetround.
Пример
Десятичное значение 0.1 не может быть представлено типом с плавающей точкой в двоичной системе. При хранении в типе IEEE-754 double оно попадает между 0x1.9999999999999*2-4 и 0x1.999999999999a*2-4. Округление до ближайшего представимого значения приводит к значению 0x1.999999999999a*2-4.
Аналогично, десятичное значение 0.3, которое находится между 0x1.3333333333333*2-2 и 0x1.3333333333334*2-2, округляется до ближайшего и хранится как 0x1.3333333333333*2-2.
#include <iostream>
#include <limits>
auto print(std::float_round_style frs)
{
switch (frs)
{
case std::round_indeterminate:
return "Rounding style cannot be determined";
case std::round_toward_zero:
return "Rounding toward zero";
case std::round_to_nearest:
return "Rounding toward nearest representable value";
case std::round_toward_infinity:
return "Rounding toward positive infinity";
case std::round_toward_neg_infinity:
return "Rounding toward negative infinity";
}
return "unknown round style";
}
int main()
{
std::cout << std::hexfloat
<< "The decimal 0.1 is stored in a double as "
<< 0.1 << '\n'
<< "The decimal 0.3 is stored in a double as "
<< 0.3 << '\n'
<< print(std::numeric_limits<double>::round_style) << '\n';
}Вывод:
The decimal 0.1 is stored in a double as 0x1.999999999999ap-4 The decimal 0.3 is stored in a double as 0x1.3333333333333p-2 Rounding toward nearest representable value
См. также
| указывает режимы округления с плавающей точкой (перечисление) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/numeric_limits/round_style