std::numeric_limits
| Défini dans l'en-tête <limits>
|
||
template< class T > class numeric_limits;
|
||
Le std::numeric_limits modèle de classe fournit une méthode standardisée pour interroger diverses propriétés des types arithmétiques (par exemple, la plus grande valeur possible pour le type int est std::numeric_limits<int>::max()).
Cette information est fournie via des spécialisations du modèle std::numeric_limits. La bibliothèque standard met à disposition des spécialisations pour tous les types arithmétiques (liste uniquement les spécialisations pour les types arithmétiques non qualifiés cv) :
| Défini dans l'en-tête <limits>
|
||
template<> class numeric_limits<bool>;
|
||
template<> class numeric_limits<char>;
|
||
template<> class numeric_limits<signed char>;
|
||
template<> class numeric_limits<unsigned char>;
|
||
template<> class numeric_limits<wchar_t>;
|
||
template<> class numeric_limits<char8_t>;
|
(depuis C++20) | |
template<> class numeric_limits<char16_t>;
|
(depuis C++11) | |
template<> class numeric_limits<char32_t>;
|
(depuis C++11) | |
template<> class numeric_limits<short>;
|
||
template<> class numeric_limits<unsigned short>;
|
||
template<> class numeric_limits<int>;
|
||
template<> class numeric_limits<unsigned int>;
|
||
template<> class numeric_limits<long>;
|
||
template<> class numeric_limits<unsigned long>;
|
||
template<> class numeric_limits<long long>;
|
(depuis C++11) | |
template<> class numeric_limits<unsigned long long>;
|
(depuis C++11) | |
template<> class numeric_limits<float>;
|
||
template<> class numeric_limits<double>;
|
||
template<> class numeric_limits<long double>;
|
||
La valeur de chaque membre d'une spécialisation de std::numeric_limits sur un type qualifié cv cv T est égale à la valeur du membre correspondant de la spécialisation sur le type non qualifié T. Par exemple, std::numeric_limits<int>::digits est égal à std::numeric_limits<const int>::digits.
Les alias de types arithmétiques (tels que std::size_t ou std::streamsize) peuvent également être examinés avec les traits de type std::numeric_limits.
Les types standard non arithmétiques, tels que std::complex<T> ou std::nullptr_t, n'ont pas de spécialisations.
|
Si l'implémentation définit des types de classe d'entiers, des spécialisations de |
(depuis C++20) |
Les implémentations peuvent fournir des spécialisations de std::numeric_limits pour des types spécifiques à l'implémentation : par exemple, GCC fournit std::numeric_limits<__int128>. Les bibliothèques non standard peuvent ajouter des spécialisations pour les types fournis par la bibliothèque, par exemple, OpenEXR fournit std::numeric_limits<half> pour un type à virgule flottante 16 bits.
Paramètres du modèle
| T | - | un type pour lequel récupérer les propriétés numériques |
Constantes membres
|
[static]
|
identifie les types pour lesquels
std::numeric_limits
est spécialisé
(constante de membre public static) |
|
[static]
|
identifie les types signés
(constante membre publique statique) |
|
[static]
|
identifie les types entiers
(constante de membre public static) |
|
[static]
|
identifie les types exacts
(constante de membre public static) |
|
[static]
|
identifie les types à virgule flottante qui peuvent représenter la valeur spéciale «infini positif»
(constante membre publique statique) |
|
[static]
|
identifie les types à virgule flottante qui peuvent représenter la valeur spéciale "not-a-number silencieux" (NaN)
(constante membre publique statique) |
|
[static]
|
identifie les types à virgule flottante qui peuvent représenter la valeur spéciale "not-a-number signalant" (NaN)
(constante membre publique statique) |
|
[static]
|
identifie le style de dénormalisation utilisé par le type à virgule flottante
(constante membre publique statique) |
|
[static]
|
identifie les types à virgule flottante qui détectent la perte de précision comme une perte de dénormalisation plutôt qu'un résultat inexact
(constante de membre public static) |
|
[static]
|
identifie le style d'arrondi utilisé par le type
(constante de membre public static) |
|
[static]
|
identifie les types à virgule flottante IEC 559/IEEE 754
(constante de membre public static) |
|
[static]
|
identifie les types qui représentent un ensemble fini de valeurs
(constante de membre public static) |
|
[static]
|
identifie les types qui gèrent les dépassements avec l'arithmétique modulo
(constante membre publique statique) |
|
[static]
|
nombre de
radix
chiffres pouvant être représentés sans modification
(constante de membre public static) |
|
[static]
|
nombre de chiffres décimaux pouvant être représentés sans modification
(constante de membre public static) |
|
[static]
(C++11)
|
nombre de chiffres décimaux nécessaires pour différencier toutes les valeurs de ce type
(constante de membre public static) |
|
[static]
|
la base ou la base entière utilisée par la représentation du type donné
(constante de membre public static) |
|
[static]
|
un de plus que la plus petite puissance négative de la base qui est une valeur normalisée valide en virgule flottante
(constante de membre public static) |
|
[static]
|
la plus petite puissance négative de dix qui est une valeur normalisée valide en virgule flottante
(constante de membre public static) |
|
[static]
|
un de plus que la plus grande puissance entière de la base qui est une valeur finie valide en virgule flottante
(constante de membre public static) |
|
[static]
|
la plus grande puissance entière de 10 qui est une valeur flottante finie valide
(constante de membre public static) |
|
[static]
|
identifie les types qui peuvent provoquer le déclenchement de pièges lors d'opérations arithmétiques
(constante membre publique statique) |
|
[static]
|
identifie les types à virgule flottante qui détectent la dénormalisation avant l'arrondi
(constante de membre public static) |
Fonctions membres
|
[static]
|
renvoie la plus petite valeur finie du type non flottant donné, ou la plus petite valeur normale positive du type flottant donné
(fonction membre publique statique) |
|
[static]
(C++11)
|
renvoie la valeur finie la plus basse du type donné, c'est-à-dire la valeur la plus négative pour les types signés,
0
pour les types non signés
(fonction membre publique statique) |
|
[static]
|
renvoie la plus grande valeur finie du type donné
(fonction membre publique statique) |
|
[static]
|
renvoie la différence entre
1.0
et la valeur représentable suivante du type flottant donné
(fonction membre publique statique) |
|
[static]
|
renvoie l'erreur d'arrondi maximale du type flottant donné
(fonction membre publique statique) |
|
[static]
|
renvoie la valeur d'infini positif du type flottant donné
(fonction membre publique statique) |
|
[static]
|
renvoie une valeur NaN silencieuse du type flottant donné
(fonction membre publique statique) |
|
[static]
|
renvoie une valeur NaN signalée du type flottant donné
(fonction membre publique statique) |
|
[static]
|
renvoie la plus petite valeur sous-normale positive du type flottant donné
(fonction membre publique statique) |
Classes d'assistance
|
indique les modes d'arrondi en virgule flottante
(enum) |
|
|
indique les modes de dénormalisation en virgule flottante
(enum) |
Relation avec les constantes de macro de la bibliothèque C
Spécialisation
std::numeric_limits<T>
où
T
est
|
Membres | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min()
|
lowest()
(C++11) |
max()
|
radix
|
||||||||
| bool | false | false | true | 2 | |||||||
| char | CHAR_MIN | CHAR_MIN | CHAR_MAX | 2 | |||||||
| signed char | SCHAR_MIN | SCHAR_MIN | SCHAR_MAX | 2 | |||||||
| unsigned char | 0 | 0 | UCHAR_MAX | 2 | |||||||
| wchar_t | WCHAR_MIN | WCHAR_MIN | WCHAR_MAX | 2 | |||||||
| char8_t | 0 | 0 | UCHAR_MAX | 2 | |||||||
| char16_t | 0 | 0 | UINT_LEAST16_MAX | 2 | |||||||
| char32_t | 0 | 0 | UINT_LEAST32_MAX | 2 | |||||||
| short | SHRT_MIN | SHRT_MIN | SHRT_MAX | 2 | |||||||
| signed short | |||||||||||
| unsigned short | 0 | 0 | USHRT_MAX | 2 | |||||||
| int | INT_MIN | INT_MIN | INT_MAX | 2 | |||||||
| signed int | |||||||||||
| unsigned int | 0 | 0 | UINT_MAX | 2 | |||||||
| long | LONG_MIN | LONG_MIN | LONG_MAX | 2 | |||||||
| signed long | |||||||||||
| unsigned long | 0 | 0 | ULONG_MAX | 2 | |||||||
| long long | LLONG_MIN | LLONG_MIN | LLONG_MAX | 2 | |||||||
| signed long long | |||||||||||
| unsigned long long | 0 | 0 | ULLONG_MAX | 2 | |||||||
Spécialisation
std::numeric_limits<T>
où
T
est
|
Membres | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
denorm_min()
|
min()
|
lowest()
(C++11) |
max()
|
epsilon()
|
digits
|
digits10
|
|||||
| float | FLT_TRUE_MIN | FLT_MIN | - FLT_MAX | FLT_MAX | FLT_EPSILON | FLT_MANT_DIG | FLT_DIG | ||||
| double | DBL_TRUE_MIN | DBL_MIN | - DBL_MAX | DBL_MAX | DBL_EPSILON | DBL_MANT_DIG | DBL_DIG | ||||
| long double | LDBL_TRUE_MIN | LDBL_MIN | - LDBL_MAX | LDBL_MAX | LDBL_EPSILON | LDBL_MANT_DIG | LDBL_DIG | ||||
Spécialisation
std::numeric_limits<T>
où
T
est
|
Membres (suite) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min_exponent
|
min_exponent10
|
max_exponent
|
max_exponent10
|
radix
|
|||||||
| float | FLT_MIN_EXP | FLT_MIN_10_EXP | FLT_MAX_EXP | FLT_MAX_10_EXP | FLT_RADIX | ||||||
| double | DBL_MIN_EXP | DBL_MIN_10_EXP | DBL_MAX_EXP | DBL_MAX_10_EXP | FLT_RADIX | ||||||
| long double | LDBL_MIN_EXP | LDBL_MIN_10_EXP | LDBL_MAX_EXP | LDBL_MAX_10_EXP | FLT_RADIX | ||||||
Exemple
#include <iostream> #include <limits> int main() { std::cout << "type\t│ lowest()\t│ min()\t\t│ max()\n" << "bool\t│ " << std::numeric_limits<bool>::lowest() << "\t\t│ " << std::numeric_limits<bool>::min() << "\t\t│ " << std::numeric_limits<bool>::max() << '\n' << "uchar\t│ " << +std::numeric_limits<unsigned char>::lowest() << "\t\t│ " << +std::numeric_limits<unsigned char>::min() << "\t\t│ " << +std::numeric_limits<unsigned char>::max() << '\n' << "int\t│ " << std::numeric_limits<int>::lowest() << "\t│ " << std::numeric_limits<int>::min() << "\t│ " << std::numeric_limits<int>::max() << '\n' << "float\t│ " << std::numeric_limits<float>::lowest() << "\t│ " << std::numeric_limits<float>::min() << "\t│ " << std::numeric_limits<float>::max() << '\n' << "double\t│ " << std::numeric_limits<double>::lowest() << "\t│ " << std::numeric_limits<double>::min() << "\t│ " << std::numeric_limits<double>::max() << '\n'; }
Sortie possible :
type │ lowest() │ min() │ max() bool │ 0 │ 0 │ 1 uchar │ 0 │ 0 │ 255 int │ -2147483648 │ -2147483648 │ 2147483647 float │ -3.40282e+38 │ 1.17549e-38 │ 3.40282e+38 double │ -1.79769e+308 │ 2.22507e-308 │ 1.79769e+308
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement correct |
|---|---|---|---|
| LWG 201 | C++98 | les spécialisations pour tous les types fondamentaux doivent être fournies | exclut les types non arithmétiques |
| LWG 559 | C++98 |
il n'était pas clair si la
std::numeric_limits
spécialisation pour un type cv-qualifié se comporte de la même manière que la spécialisation correspondante pour le type non cv-qualifié |
ils ont le
même comportement |