std::numeri...round_style(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… NAME πŸ’…

std::numeric_limits::round_style β€” std::numeric_limits::round_style

okay bestie, welcome to the std::numeri...round_style(3) page from the C++ Standard Libary manual. This is literally the glow-up guide to how your floating-point type rounds stuff when a value isn't exactly representable. iconic behavior only ✨


✨ Synopsis ✨

static const std::float_round_style round_style;      (until C++11)
static constexpr std::float_round_style round_style;  (since C++11)

The value of std::numeric_limits<T>::round_style identifies the rounding style used by the floating-point type T whenever a value that is not one of the exactly representable values of T is stored in an object of that type. no cap, that's the whole vibe πŸŽ€


πŸŽ€ Standard specializations πŸŽ€

Here's the value of std::numeric_limits<T>::round_style for each T, bestie:

  • /* non-specialized */ β€” 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 (since C++20) β€” std::round_toward_zero
  • char16_t (since C++11) β€” std::round_toward_zero
  • char32_t (since 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 (since C++11) β€” std::round_toward_zero
  • unsigned long long (since C++11) β€” std::round_toward_zero
  • float β€” usually std::round_to_nearest
  • double β€” usually std::round_to_nearest
  • long double β€” usually std::round_to_nearest

🧠 Notes 🧠

These values are constants, and do not reflect the changes to the rounding made by std::fesetround. The changed values may be obtained from FLT_ROUNDS or std::fegetround. so yeah, don't expect this constant to spill the tea about runtime rounding changes πŸ‘€


πŸ’– Example πŸ’–

The decimal value 0.1 cannot be represented by a binary floating-point type. When stored in an IEEE-754 double, it falls between 0x1.9999999999999*2-4 and 0x1.999999999999a*2-4. Rounding to nearest representable value results in 0x1.999999999999a*2-4. πŸ¦‹

Similarly, the decimal value 0.3, which is between 0x1.3333333333333*2-2 and 0x1.3333333333334*2-2, is rounded to nearest and is stored as 0x1.3333333333333*2-2. literally math with main character energy πŸ’…

// Run this code

#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';
}

Output:

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

πŸ‘€ See also πŸ‘€

  • float_round_style β€” indicates floating-point rounding modes (enum)

xoxo, your bestie πŸ’– β€” source: http://cppreference.com, version/date: 2024.06.10, page: std::numeri...round_style(3) πŸŒˆπŸ‘‘

πŸ“¦ where this page comes from