std::numeric_limits<T>::digits10
static const int digits10; |
(bis C++11) | |
| static constexpr int digits10; |
(seit C++11) | |
Der Wert von std::numeric_limits<T>::digits10 ist die Anzahl der Dezimalstellen, die vom Typ T ohne Veränderung dargestellt werden können, d.h. jede Zahl mit dieser Anzahl von signifikanten Dezimalstellen kann in einen Wert vom Typ T und zurück in Dezimalform umgewandelt werden, ohne Veränderung durch Rundung oder Überlauf. Für Typen mit Basis-radix ist es der Wert von digits() (digits - 1 für Gleitkommatypen) multipliziert mit log10(radix) und abgerundet.
[bearbeiten] Standard-Spezialisierungen
T
|
Wert von std::numeric_limits<T>::digits10 |
| /* nicht spezialisiert */ | 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 (seit C++20) | std::numeric_limits<char8_t>::digits * std::log10(2) |
| char16_t (seit C++11) | std::numeric_limits<char16_t>::digits * std::log10(2) |
| char32_t (seit 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 (seit C++11) | std::numeric_limits<long long>::digits * std::log10(2) |
| unsigned long long (seit C++11) | std::numeric_limits<unsigned long long>::digits * std::log10(2) |
| float | FLT_DIG (6 für IEEE float) |
| double | DBL_DIG (15 für IEEE double) |
| long double | LDBL_DIG (18 für 80-Bit Intel long double; 33 für IEEE quadruple) |
[bearbeiten] Beispiel
Ein 8-Bit-Binärtyp kann jede zweistellige Dezimalzahl exakt darstellen, aber 3-stellige Dezimalzahlen von 256 bis 999 können nicht dargestellt werden. Der Wert von digits10 für einen 8-Bit-Typ ist 2 (8 * std::log10(2) ist 2.41)
Der Standard-32-Bit-IEEE-754-Gleitkommatyp hat einen 24-Bit-Nachkommateil (23 geschriebene Bits, ein implizites Bit), was darauf hindeuten könnte, dass er 7-stellige Dezimalzahlen darstellen kann (24 * std::log10(2) ist 7.22), aber relative Rundungsfehler sind nicht einheitlich und einige Gleitkommazahlen mit 7 Dezimalstellen überstehen die Konvertierung zu 32-Bit-Float und zurück nicht: das kleinste positive Beispiel ist 8.589973e9, was nach dem Roundtrip zu 8.589974e9 wird. Diese Rundungsfehler können nicht mehr als ein Bit in der Darstellung betragen, und digits10 wird berechnet als (24 - 1) * std::log10(2), was 6.92 ergibt. Abrunden führt zum Wert 6.
Ebenso übersteht die 16-stellige Zeichenkette 9007199254740993 keinen Text->Double->Text-Roundtrip und wird zu 9007199254740992: der 64-Bit IEEE-754-Typ double garantiert diesen Roundtrip nur für 15 Dezimalstellen.
[bearbeiten] Siehe auch
| [statisch] (C++11) |
Anzahl der Dezimalstellen, die notwendig sind, um alle Werte dieses Typs zu unterscheiden (öffentlicher statischer Member-Konstante) |
| [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] |
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) |