Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@scivola

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

More than 1 year has passed since last update.

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

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
scivola
主に Ruby を使ってます。Rust に興味を持っています。校閲承ります。私信は Slack の ruby-jp からどうぞ。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?