std::numeric_limits<T>::digits10
static const int digits10;
|
(jusqu'à C++11) | |
static constexpr int digits10;
|
(depuis C++11) | |
La valeur de std::numeric_limits<T>::digits10 est le nombre de chiffres en base 10 qui peuvent être représentés par le type T sans altération, c'est-à-dire que tout nombre ayant ce nombre de chiffres décimaux significatifs peut être converti en une valeur de type T et inversement en forme décimale, sans altération due à un arrondi ou un débordement. Pour les types en base-radix, il s'agit de la valeur de digits() (digits - 1 pour les types à virgule flottante) multipliée par log10(radix) et arrondie à l'entier inférieur.
Spécialisations standards
T
|
valeur de std:: numeric_limits < T > :: digits10 |
| /* non-spécialisé */ | 0 |
| bool | 0 |
| char | std:: numeric_limits < char > :: digits * std:: log10 ( 2 ) |
| signed char | std:: numeric_limits < signed char > :: digits * std:: log10 ( 2 ) |
| unsigned char | std:: numeric_limits < unsigned char > :: digits * std:: log10 ( 2 ) |
| wchar_t | std:: numeric_limits < wchar_t > :: digits * std:: log10 ( 2 ) |
| char8_t (depuis C++20) | std:: numeric_limits < char8_t > :: digits * std:: log10 ( 2 ) |
| char16_t (depuis C++11) | std:: numeric_limits < char16_t > :: digits * std:: log10 ( 2 ) |
| char32_t (depuis C++11) | std:: numeric_limits < char32_t > :: digits * std:: log10 ( 2 ) |
| short | std:: numeric_limits < short > :: digits * std:: log10 ( 2 ) |
| unsigned short | std:: numeric_limits < unsigned short > :: digits * std:: log10 ( 2 ) |
| int | std:: numeric_limits < int > :: digits * std:: log10 ( 2 ) |
| unsigned int | std:: numeric_limits < unsigned int > :: digits * std:: log10 ( 2 ) |
| long | std:: numeric_limits < long > :: digits * std:: log10 ( 2 ) |
| unsigned long | std:: numeric_limits < unsigned long > :: digits * std:: log10 ( 2 ) |
| long long (depuis C++11) | std:: numeric_limits < long long > :: digits * std:: log10 ( 2 ) |
| unsigned long long (depuis C++11) | std:: numeric_limits < unsigned long long > :: digits * std:: log10 ( 2 ) |
| float | FLT_DIG ( 6 pour IEEE float ) |
| double | DBL_DIG ( 15 pour IEEE double ) |
| long double | LDBL_DIG ( 18 pour le long double 80-bit Intel ; 33 pour le quadruple IEEE) |
Exemple
Un type binaire 8 bits peut représenter exactement n'importe quel nombre décimal à deux chiffres, mais les nombres décimaux à 3 chiffres 256..999 ne peuvent pas être représentés. La valeur de
digits10
pour un type 8 bits est 2 (
8
*
std::
log10
(
2
)
est 2.41)
Le type à virgule flottante standard IEEE 754 32 bits possède une partie fractionnaire de 24 bits (23 bits écrits, un implicite), ce qui pourrait suggérer qu'il peut représenter des nombres décimaux à 7 chiffres (
24
*
std::
log10
(
2
)
vaut 7,22), mais les erreurs d'arrondi relatives ne sont pas uniformes et certaines valeurs à virgule flottante avec 7 chiffres décimaux ne survivent pas à la conversion en float 32 bits et retour : le plus petit exemple positif est
8.589973e9
, qui devient
8.589974e9
après l'aller-retour. Ces erreurs d'arrondi ne peuvent pas dépasser un bit dans la représentation, et
digits10
est calculé comme
(
24
-
1
)
*
std::
log10
(
2
)
, ce qui vaut 6,92. L'arrondi à l'entier inférieur donne la valeur 6.
De même, la chaîne de 16 chiffres 9007199254740993 ne survit pas au parcours texte->double->texte, devenant 9007199254740992 : le type double IEEE 754 64 bits ne garantit ce parcours que pour 15 chiffres décimaux.
Voir aussi
|
[static]
(C++11)
|
nombre de chiffres décimaux nécessaires pour différencier toutes les valeurs de ce type
(constante de membre statique publique) |
|
[static]
|
la base entière utilisée par la représentation du type donné
(constante de membre statique publique) |
|
[static]
|
nombre de chiffres en base
radix
pouvant être représentés sans modification
(constante de membre statique publique) |
|
[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 statique publique) |
|
[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 statique publique) |