std::numeric_limits<T>:: max_digits10
|
static
constexpr
int
max_digits10
|
(seit C++11) | |
Der Wert von
std::
numeric_limits
<
T
>
::
max_digits10
ist die Anzahl der Basis-10-Ziffern, die erforderlich sind, um alle unterschiedlichen Werte des Typs
T
eindeutig darzustellen, wie sie beispielsweise für Serialisierung/Deserialisierung in Text benötigt werden. Diese Konstante ist für alle Gleitkommatypen von Bedeutung.
Inhaltsverzeichnis |
Standardspezialisierungen
T
|
Wert von std:: numeric_limits < T > :: max_digits10 |
| /* nicht spezialisiert */ | 0 |
| bool | 0 |
| char | 0 |
| signed char | 0 |
| unsigned char | 0 |
| wchar_t | 0 |
| char8_t (seit 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 oder std:: ceil ( std:: numeric_limits < float > :: digits * std:: log10 ( 2 ) + 1 ) |
| double | DBL_DECIMAL_DIG oder std:: ceil ( std:: numeric_limits < double > :: digits * std:: log10 ( 2 ) + 1 ) |
| long double | DECIMAL_DIG oder LDBL_DECIMAL_DIG oder std:: ceil ( std:: numeric_limits < long double > :: digits * std:: log10 ( 2 ) + 1 ) |
Hinweise
Im Gegensatz zu den meisten mathematischen Operationen ist die Konvertierung eines Fließkommawerts in Text und zurück
exakt
, solange mindestens
max_digits10
verwendet wurden (
9
für
float
,
17
für
double
): Es ist garantiert, dass derselbe Fließkommawert erzeugt wird, auch wenn die Zwischentextdarstellung nicht exakt ist. Es können über hundert Dezimalstellen erforderlich sein, um den genauen Wert eines
float
in Dezimalschreibweise darzustellen.
Beispiel
#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); }
Ausgabe:
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
Siehe auch
|
[static]
|
die Basis oder Ganzzahlbasis, die für die Darstellung des gegebenen Typs verwendet wird
(öffentliche statische Elementkonstante) |
|
[static]
|
Anzahl der
radix
Ziffern, die ohne Änderung dargestellt werden können
(öffentliche statische Elementkonstante) |
|
[static]
|
Anzahl der Dezimalziffern, die ohne Änderung dargestellt werden können
(öffentliche statische Elementkonstante) |
|
[static]
|
eins mehr als der kleinste negative Exponent der Basis, der einen gültigen normalisierten Gleitkommawert darstellt
(öffentliche statische Elementkonstante) |
|
[static]
|
eins mehr als der größte ganzzahlige Exponent der Basis, der einen gültigen endlichen Gleitkommawert darstellt
(öffentliche statische Elementkonstante) |