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 |
|---|---|
| /* non-specialized */ |
std::round_toward_zero |
| bool |
std::round_toward_zero |
| char |
std::round_toward_zero |
| signedchar |
std::round_toward_zero |
| unsignedchar |
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 |
| unsignedshort |
std::round_toward_zero |
| int |
std::round_toward_zero |
| unsignedint |
std::round_toward_zero |
| long |
std::round_toward_zero |
| unsignedlong |
std::round_toward_zero |
| longlong (начиная с C++11) |
std::round_toward_zero |
| unsignedlonglong (начиная с C++11) |
std::round_toward_zero |
| float | обычно std::round_to_nearest |
| double | обычно std::round_to_nearest |
| longdouble | обычно 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/cpp/types/numeric_limits/round_style