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 Dezimalziffern, die erforderlich sind, um alle unterschiedlichen Werte des Typs T eindeutig darzustellen, wie sie z. B. für die Serialisierung/Deserialisierung in Text erforderlich sind. Diese Konstante ist für alle Gleitkommatypen aussagekräftig.
Inhalt |
[bearbeiten] Standard-Spezialisierungen
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) |
[bearbeiten] Anmerkungen
Im Gegensatz zu den meisten mathematischen Operationen ist die Umwandlung eines Gleitkommawerts 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 Gleitkommawert erzeugt wird, auch wenn die Zwischentextdarstellung nicht exakt ist. Es können über hundert Dezimalstellen erforderlich sein, um den präzisen Wert eines float in Dezimaldarstellung zu repräsentieren.
[bearbeiten] 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[bearbeiten] Siehe auch
| [static] |
die Basis oder der ganzzahlige Basiswert, der für die Darstellung des gegebenen Typs verwendet wird (öffentliche statische Member-Konstante) |
| [static] |
Anzahl der radix-Ziffern, die ohne Änderung dargestellt werden können(öffentliche statische Member-Konstante) |
| [static] |
Anzahl der Dezimalziffern, die ohne Änderung dargestellt werden können (öffentlicher statischer Member-Konstante) |
| [static] |
eins mehr als die kleinste negative Potenz der Basis, die ein gültiger normalisierter Gleitkommawert ist (öffentliche statische Member-Konstante) |
| [static] |
eins mehr als die größte ganzzahlige Potenz der Basis, die ein gültiger endlicher Gleitkommawert ist (öffentliche statische Member-Konstante) |