std::numeric_limits<T>:: max_digits10
|
static
constexpr
int
max_digits10
|
(depuis C++11) | |
La valeur de
std::
numeric_limits
<
T
>
::
max_digits10
est le nombre de chiffres en base 10 nécessaires pour représenter de manière unique toutes les valeurs distinctes du type
T
, comme requis pour la sérialisation/désérialisation en texte. Cette constante est significative pour tous les types à virgule flottante.
Table des matières |
Spécialisations standards
T
|
Valeur de std:: numeric_limits < T > :: max_digits10 |
| /* non-spécialisé */ | 0 |
| bool | 0 |
| char | 0 |
| signed char | 0 |
| unsigned char | 0 |
| wchar_t | 0 |
| char8_t (depuis C++20) | 0 |
| char16_t | 0 |
| char32_t | 0 |
| short | 0 |
| unsigned short | 0 |
| int | 0 |
| unsigned int | 0 |
| long | 0 |
| unsigned long | 0 |
| long long | 0 |
| unsigned long long | 0 |
| float | FLT_DECIMAL_DIG ou std:: ceil ( std:: numeric_limits < float > :: digits * std:: log10 ( 2 ) + 1 ) |
| double | DBL_DECIMAL_DIG ou std:: ceil ( std:: numeric_limits < double > :: digits * std:: log10 ( 2 ) + 1 ) |
| long double | DECIMAL_DIG ou LDBL_DECIMAL_DIG ou std:: ceil ( std:: numeric_limits < long double > :: digits * std:: log10 ( 2 ) + 1 ) |
Notes
Contrairement à la plupart des opérations mathématiques, la conversion d'une valeur flottante en texte et inversement est
exacte
tant qu'au moins
max_digits10
sont utilisés (
9
pour
float
,
17
pour
double
) : il est garanti de produire la même valeur flottante, même si la représentation textuelle intermédiaire n'est pas exacte. Il peut falloir plus d'une centaine de chiffres décimaux pour représenter la valeur précise d'un
float
en notation décimale.
Exemple
#include <cmath> #include <iomanip> #include <iostream> #include <limits> #include <sstream> int main() { float value = 10.0000086; constexpr auto digits10 = std::numeric_limits<decltype(value)>::digits10; constexpr auto max_digits10 = std::numeric_limits<decltype(value)>::max_digits10; constexpr auto submax_digits10 = max_digits10 - 1; std::cout << "float:\n" " digits10 is " << digits10 << " digits\n" " max_digits10 is " << max_digits10 << " digits\n" "submax_digits10 is " << submax_digits10 << " digits\n\n"; const auto original_precision = std::cout.precision(); for (auto i = 0; i < 5; ++i) { std::cout << " max_digits10: " << std::setprecision(max_digits10) << value << "\n" "submax_digits10: " << std::setprecision(submax_digits10) << value << "\n\n"; value = std::nextafter(value, std::numeric_limits<decltype(value)>::max()); } std::cout.precision(original_precision); }
Sortie :
float:
digits10 is 6 digits
max_digits10 is 9 digits
submax_digits10 is 8 digits
max_digits10: 10.0000086
submax_digits10: 10.000009
max_digits10: 10.0000095
submax_digits10: 10.00001
max_digits10: 10.0000105
submax_digits10: 10.00001
max_digits10: 10.0000114
submax_digits10: 10.000011
max_digits10: 10.0000124
submax_digits10: 10.000012
Voir aussi
|
[static]
|
la base ou le système de numération entier utilisé par la représentation du type donné
(constante de membre public static) |
|
[static]
|
nombre de chiffres en base
radix
qui peuvent être représentés sans changement
(constante de membre public static) |
|
[static]
|
nombre de chiffres décimaux qui peuvent être représentés sans changement
(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]
|
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) |