Spec-Zone.ru › C++

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

См. также

float_round_style
указывает режимы округления с плавающей точкой
(перечисление)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/numeric_limits/round_style

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API