std:: numeric_limits
|
Défini dans l'en-tête
<limits>
|
||
|
template
<
class
T
>
class
numeric_limits
;
|
||
La classe template
std::numeric_limits
fournit un moyen standardisé d'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
(
)
).
Ces informations sont fournies 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 (ne liste que 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 standards 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 entière
, 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.
Table des matières |
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 |