いろきゅうのブログ

はてなダイアリーから移行中…

numeric_limits::digits10

(昨日からの続き)
C++には numeric_limits という型の情報を取得する為のクラステンプレート(?)があります。
その中に、桁数を管理するような何かが無いかなー と、ヘッダーをダラダラ見ていたら "digits10" なるメンバがある事に気づきました。 なんか、それっぽくね? と。
定義を見てみると…(intの場合)


 _STCONS(int, digits10, (CHAR_BIT * sizeof (int) - 1) * 301L / 1000);

301L / 1000 … 0.301とな。
そういえば、桁数に関する数値で 0.301 って見たことある。 やっぱり、この変数が10進数の時の桁数かっ!?

確認する為に手動で計算してみる事にしました。

INTの最大値は…

2147483647 <- 最大値
0987654321 <- 桁数

10桁

CHAR_BIT は 8 と定義されているので、
int digits10 は
(8 * 4 - 1) * 301 / 1000 = 9.331 -> int なので 9

9桁  …?


… な ん か 足 り な く ね ?


とはいえ、よくよく考えてみたら、本当は 9.331桁 必要な訳で、小数部を切り捨ているので、足りなくなっているっぽいですな。 繰り上げすると、見事 10桁になりますし。


というわけで、numeric_limits::digits10 の値に対して

・繰上げ用 +1
・符号用に +1
・\0 用に +1
   -> 計 +3

すれば、良いんじゃないかなと思ってみたりします。 …が、本当にいいのかしら。(ぉ ^^;
ついでに浮動小数点型については、この方法は非常に怪しいもよう…う〜む。