• ベストアンサー

巨大な整数の表示

マニュアルによると、puts 2**1000 で、300-400桁ほどの大きい整数が全表示されるはずです。しかし0としか表示されません。puts 2**100でも同じ事です。puts 2**50で、ようやく全表示されます。どんな巨大な数でも表示されるようにしたいのです。Rubyではそれが可能と聞いてます。ちなみに、Ruby 1.8.7を使用しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

rubyではfixnumで表現できないものはbignumに自動的に変換されるそうですが、動きからすると64bitの上限に達しているのにbignumへの自動変換ができていないように見えます。2**50はOKで2**100だとダメというのだと、そういうことかと。 一応手元の、1.8.3p371で起きて、ruby 1.9.3p484では起きなかったので、この間で修正されたのではないかと当たりをつけて調べてみました。 両方のソースのファイル名をざっと見ると、bignum.cと一緒にnumeric.cというのがあり、中身を見る限り、fix_*という関数があるので、これがfixnumの実装だと思います。ちなみに、bignum.cもチラッと見ると、こちらはbig_*という関数があります。2**50で起きたというのでpowerなどの名前がついた関数を探すと、fix_powというfixnumのpowerを表しそうなものが見つかり、両方がfixnumだとint_powを呼んでいるのがわかります。 それで、起きたものと起きなかったものint_powを見比べると次のところが違います。 1.8.3p371: 2321 while (y % 2 == 0) { 2322 long x2 = x * x; 2323 if (x2/x != x || !POSFIXABLE(x2)) { 2324 VALUE v; 1.9.3p484: 2717 while (y % 2 == 0) { 2718 if (!FIT_SQRT_LONG(x)) { 2719 VALUE v; http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/numeric.c?view=log をざっと見た感じだと、このへんで修正されたのではないでしょうか。 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=12778 というわけで、1.9.1などこの修正が入ったあとのバージョンだとputs 2**1000が表示されると思います。

gbRubyTuesday
質問者

お礼

どうもありがとうございました!

関連するQ&A