LoginSignup
7
1

More than 3 years have passed since last update.

10⁹⁹⁴²⁰⁶⁷ は 8 桁である

Posted at

この記事は下記の記事の続編ともいうべきものです。
桁数は 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 で計算できる。


  1. もちろん計算するまでもなく 9942068 桁である。 

7
1
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1