2016-04-14 5 views
0

Warum std::numeric_limits<Any Int Type>::digits10 ist eine weniger als es sein kann?Warum ist std :: numeric_limits :: digits10 für int-Typen weniger?

Zum Beispiel std::numeric_limits<int8_t>::digits10 == 2, aber 100 besteht aus drei Ziffern.

Oder std::numeric_limits<int64_t>::digits10 == 18, aber INT64_MAX (9'223'372'036'854'775'807) besteht aus 19 Ziffern.

+1

[cppreference] darstellen (http://en.cppreference.com/w/cpp/types/numeric_limits/digits10) sagt: "Eine beliebige Zahl mit so vielen Dezimalziffern kann vom Typ gehalten werden". Da 999 nicht durch 'int8_t' repräsentiert werden kann, kann die Antwort nicht 3 sein. –

+0

@KerrekSB Ha, verstanden. Vielen Dank! – vladon

Antwort

1

std::numeric_limits<T>::digits10 ist die garantiert Anzahl der Stellen in dem Sinne, dass eine Zahl mit so vielen Stellen kann in Typ Tohne Überlauf oder Informationsverlust verursacht dargestellt werden.

z. std::numeric_limits<int64_t>::digits10 kann nicht 19 sein, da 9'223'372'036'854'775'808 19 Ziffern hat, aber in int64_t nicht darstellbar ist.

Im allgemeinen Fall solchen Garantiewert von digits<N> wird von dieser „einer weniger“ Diskrepanz auf Plattformen immer leiden, wo digits<N> keine Potenz von radix für die interne Darstellung verwendet wird. In nicht-exotischen Fällen ist 2. Da 10 keine Potenz von 2 ist, ist digits10 um 1 kleiner als die Länge des Maximalwerts.

Wenn std::numeric_limits<T> enthalten digits16 oder digits8 wären diese Werte für radix 2-Plattformen "präzise" gewesen.

1

Die Definition von numeric_limits :: Ziffern ist wie folgt:

Der Wert std :: :: numeric_limits digits10 ist die Anzahl der Basis 10 Ziffern, die durch den Typ T ohne Änderung dargestellt werden kann, das heißt Jede Zahl mit diesen vielen Dezimalziffern kann in einen Wert vom Typ T und zurück in die Dezimalform umgewandelt werden, ohne Änderung aufgrund von Rundung oder Überlauf.

Das bedeutet, dass int8_t 2 Ziffern ist, weil es einige 3-stellige Zahlen sind, können Sie nicht mit einem int8_t (dh 999)

Verwandte Themen