2016-04-14 19 views
0

なぜstd::numeric_limits<Any Int Type>::digits10はそれより少ないのでしょうか?int型のstd :: numeric_limits :: digits10が1つ少ないのはなぜですか?

たとえば、std::numeric_limits<int8_t>::digits10 == 2ですが、100は3桁で構成されています。

またはstd::numeric_limits<int64_t>::digits10 == 18ですが、INT64_MAX(9'223'372'036'854'775'807)は19桁で構成されています。

+1

[cppreference](http://en.cppreference.com/w/cppがあるのでint8_tが2桁の数字であることを意味/ types/numeric_limits/digits10)は次のように言っています: "この10進数の数字はすべて、その型で保持できます"。 999は 'int8_t'で表現できないので、答えは3になることはできません。 –

+0

@KerrekSB Ha、得ました。ありがとう! – vladon

答えて

1

std::numeric_limits<T>::digits10は、多くの桁数がオーバーフローまたは情報の損失を引き起こすことなく、タイプTで表すことができるという意味の桁保証数です。

など。 std::numeric_limits<int64_t>::digits10は19桁で9'223'372'036'854'775'808の数値を持つことはできませんが、int64_tでは表記できません。

一般的に、digits<N>の保証値は、digits<N>が内部表現に使用されるべき累乗でないプラットフォームでは、この「1度」の不一致を常に被ります。非外来の場合、radixは2です.10は2の累乗ではないため、digits10は最大値の長さより1小さいです。

std::numeric_limits<T>を含む場合digits16またはdigits8これらの値は基数2のプラットフォームでは「正確」でした。

1

のnumeric_limitsの定義::数字は以下の通りである:

STDの値::のnumeric_limits :: digits10はつまり、変更なしタイプTで表すことができ、ベース10桁の数でありますこの小数点以下の桁数を持つ数値は、丸めやオーバーフローのために変更されることなく、タイプTの値に変換して小数点形式に戻すことができます。

これは、あなたがint8_tと表すことができないいくつかの3桁の数字(つまり999)

関連する問題