この記事は下記の記事の続編ともいうべきものです。
桁数は Math.log10(x).floor + 1 でいいのか - Qiita
さて,$10^{9942067}$ は 10 進で何桁の数だろうか1。
Ruby なら簡単さ。
irb(main):001:0> (10 ** 9942067).to_s.length
(irb):1: warning: in a**b, b may be too big
=> 8
え? は,8 桁ぁ? ど,どういうこと?
しかも何か変な警告が出てるし。つか,この警告がヒントか。要するにデカすぎてちゃんと計算できてないってこと? でもエラーじゃないしな。
いっそ .to_s.length
を取って実行してみるか。
いや待てよ,もし巨大整数が表示されようとしたらターミナルがしばらく操作不能になりそうだしな。
えーい,やっちまえ。
irb(main):001:0> 10 ** 9942067
(irb):1: warning: in a**b, b may be too big
=> Infinity
へ? Float::INFINITY ってこと?
整数の整数乗なのに「浮動小数点数の正の無限大」になると?
あの,もしかして答えの「8」って,Infinity
の文字数ですかい?
irb(main):002:0> Float::INFINITY.to_s
=> "Infinity"
やっぱし。
ちなみに,指数が 1 小さい $10^{9942066}$ は 10 ** 9942066
で計算できる。
このあたり,Ruby のバージョンにもよるそう。この記事は Ruby 2.7.1 に基づいている。
**
は,結果が巨大すぎる整数になりそうなとき,計算を放棄して警告を出したうえで Float::INFINITY
を返す,という仕様だそうです。
なので,実際的なプログラムで本当にそんな事態が起こりそうなときは,計算結果を finite?
で確認したうえで使う必要がありそう。
なお,$10^{9942067}$ を本当に計算したければ 10 ** 9942066 * 10
で計算できる。
-
もちろん計算するまでもなく 9942068 桁である。 ↩