Namespaces
Variants

std::numeric_limits<T>:: digits10

From cppreference.net
Utilities library
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 Basis-10-Ziffern, die vom Typ T ohne Änderung dargestellt werden können, das heißt, jede Zahl mit dieser Anzahl signifikanter Dezimalziffern kann in einen Wert des Typs T und zurück in Dezimalform umgewandelt werden, ohne dass es aufgrund von Rundung oder Überlauf zu Änderungen kommt. Für Basis- Radix -Typen ist es der Wert von digits() ( digits - 1 für Gleitkommatypen) multipliziert mit log 10 (radix) und abgerundet.

Standardspezialisierungen

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)

Beispiel

Ein 8-Bit-Binärtyp kann jede zweistellige Dezimalzahl exakt darstellen, aber dreistellige Dezimalzahlen 256..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 standardmäßige 32-Bit-IEEE-754-Gleitkommatyp hat einen 24-Bit-Bruchteil (23 geschriebene Bits, eines implizit), was nahelegen könnte, dass er 7-stellige Dezimalzahlen darstellen kann ( 24 * std:: log10 ( 2 ) beträgt 7,22), aber relative Rundungsfehler sind ungleichmäßig und einige Gleitkommawerte mit 7 Dezimalstellen überstehen die Konvertierung zu 32-Bit-Float und zurück nicht: das kleinste positive Beispiel ist 8.589973e9 , das nach dem Rundungsdurchlauf zu 8.589974e9 wird. Diese Rundungsfehler können kein Bit in der Darstellung überschreiten, 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 den Text->Double->Text-Roundtrip nicht und wird zu 9007199254740992 : Der 64-Bit-IEEE-754-Typ double garantiert diesen Roundtrip nur für 15 Dezimalstellen.

Siehe auch

[static] (C++11)
Anzahl der Dezimalstellen, die notwendig sind, um alle Werte dieses Typs zu unterscheiden
(öffentliche statische Memberkonstante)
[static]
die Basis oder Ganzzahlbasis, die von der Darstellung des gegebenen Typs verwendet wird
(öffentliche statische Memberkonstante)
[static]
Anzahl der radix -Ziffern, die ohne Änderung dargestellt werden können
(öffentliche statische Memberkonstante)
eins mehr als der kleinste negative Exponent der Basis, der einen gültigen normalisierten Gleitkommawert darstellt
(öffentliche statische Memberkonstante)
eins mehr als der größte ganzzahlige Exponent der Basis, der einen gültigen endlichen Gleitkommawert darstellt
(öffentliche statische Memberkonstante)