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