2016-04-14 2 views
0

Pourquoi std::numeric_limits<Any Int Type>::digits10 est un de moins que cela peut être? Par exemple, std::numeric_limits<int8_t>::digits10 == 2, mais 100 est constitué de trois chiffres.Pourquoi std :: numeric_limits :: digits10 est-il inférieur de un pour les types int?

Ou, std::numeric_limits<int64_t>::digits10 == 18, mais INT64_MAX (9'223'372'036'854'775'807) se compose de 19 chiffres.

+1

[cppreference] (http://en.cppreference.com/w/cpp/types/numeric_limits/digits10) dit: "n'importe quel nombre avec autant de chiffres décimaux peut être tenu par le type". Puisque 999 ne peut pas être représenté par 'int8_t', la réponse ne peut pas être 3. –

+0

@KerrekSB Ha, j'ai compris. Merci! – vladon

Répondre

1

std::numeric_limits<T>::digits10 est le garanti nombre de chiffres dans un sens qu'un certain nombre avec le nombre de chiffres peut être représenté dans le type Tsans provoquer de débordement ou de perte d'informations.

E.g. std::numeric_limits<int64_t>::digits10 ne peut pas être 19 car 9'223'372'036'854'775'808 a 19 chiffres mais n'est pas représentable dans int64_t.

En général, cette valeur garantie de digits<N> souffrira toujours de cet écart «un de moins» sur les plateformes où digits<N> n'est pas une puissance de radix utilisée pour la représentation interne. Dans les cas non-exotiques radix est 2. Puisque 10 n'est pas une puissance de 2, digits10 est plus petit de 1 que la longueur de la valeur maximale.

Si std::numeric_limits<T> incluait digits16 ou digits8 ces valeurs auraient été "précises" pour les plates-formes radix 2.

1

La définition de numeric_limits :: chiffres est la suivante:

La valeur de std :: numeric_limits :: digits10 est le nombre de base 10 chiffres qui peuvent être représentés par le type T sans changement, c'est , n'importe quel nombre avec autant de chiffres décimaux peut être converti en une valeur de type T et revenir à la forme décimale, sans changement dû à l'arrondi ou au débordement.

Cela signifie que int8_t est 2 chiffres parce qu'il ya des numéros à 3 chiffres que vous ne pouvez pas représenter avec un int8_t (ie 999)