Namespaces
Variants

std::numeric_limits<T>:: round_style

From cppreference.net
Utilities library
static const std:: float_round_style round_style ;
(jusqu'à C++11)
static constexpr std:: float_round_style round_style ;
(depuis C++11)

La valeur de std:: numeric_limits < T > :: round_style identifie le style d'arrondi utilisé par le type à virgule flottante T chaque fois qu'une valeur qui n'est pas l'une des valeurs exactement représentables de T est stockée dans un objet de ce type.

Table des matières

Spécialisations standards

T valeur de std:: numeric_limits < T > :: round_style
/* non-spécialisé */ 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 (depuis C++20) std::round_toward_zero
char16_t (depuis C++11) std::round_toward_zero
char32_t (depuis 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 (depuis C++11) std::round_toward_zero
unsigned long long (depuis C++11) std::round_toward_zero
float généralement std::round_to_nearest
double généralement std::round_to_nearest
long double généralement std::round_to_nearest

Notes

Ces valeurs sont des constantes et ne reflètent pas les modifications d'arrondi effectuées par std::fesetround . Les valeurs modifiées peuvent être obtenues à partir de FLT_ROUNDS ou std::fegetround .

Exemple

La valeur décimale 0.1 ne peut pas être représentée par un type à virgule flottante binaire. Lorsqu'elle est stockée dans un double IEEE-754, elle se situe entre 0x1.9999999999999*2 -4
et 0x1.999999999999a*2 -4
. L'arrondi à la valeur représentable la plus proche donne 0x1.999999999999a*2 -4
.

De même, la valeur décimale 0.3 , qui se situe entre 0x1.3333333333333*2 -2
et 0x1.3333333333334*2 -2
est arrondie au plus près et est stockée comme 0x1.3333333333333*2 -2
.

#include <iostream>
#include <limits>
auto print(std::float_round_style frs)
{
    switch (frs)
    {
        case std::round_indeterminate:
            return "Le style d'arrondi ne peut pas être déterminé";
        case std::round_toward_zero:
            return "Arrondi vers zéro";
        case std::round_to_nearest:
            return "Arrondi vers la valeur représentable la plus proche";
        case std::round_toward_infinity:
            return "Arrondi vers l'infini positif";
        case std::round_toward_neg_infinity:
            return "Arrondi vers l'infini négatif";
    }
    return "style d'arrondi inconnu";
}
int main()
{
    std::cout << std::hexfloat
              << "Le décimal 0.1 est stocké dans un double comme "
              << 0.1 << '\n'
              << "Le décimal 0.3 est stocké dans un double comme "
              << 0.3 << '\n'
              << print(std::numeric_limits<double>::round_style) << '\n';
}

Sortie :

Le décimal 0.1 est stocké dans un double comme 0x1.999999999999ap-4
Le décimal 0.3 est stocké dans un double comme 0x1.3333333333333p-2
Arrondi vers la valeur représentable la plus proche

Voir aussi

indique les modes d'arrondi en virgule flottante
(enum)