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
/* 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

См. также

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

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

Spec-Zone.ru

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