• ベストアンサー

巨大な整数の表示

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

  • Ruby
  • 回答数1
  • ありがとう数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

  • 3つの整数が等しいかどうか調べるプログラム

    3つの整数が等しいかどうか調べるプログラムがよくわからないので、どなたか教えていただけないでしょうか?ちなみに、わからないながらに作ってみました。 #include <stdio.h> int main(void) { int x, y, z; puts("3つの整数を入力してください。"); printf("整数1:"); scanf("%d",&x); printf("整数2:"); scanf("%d",&y); printf("整数3:"); scanf("%d",&z); if (x==y==z) puts("3つの整数の値は同じです。"); else puts("3つの整数の値は違います。"); return (0); }

  • 3を3つ使ってできる最大の整数は?

    こんにちは。 「3を3つ使ってできる最大の整数は?」という問題を出されました。ただし条件があるそうです。 (1)四則演算(+-×÷)とカッコはいくつ使ってもよい。 (2)3以外の数字は使ってはいけない。 (3)3はひと桁の整数として使用する。(33や333はだめ) (4)高校数学までで習う数学記号は上記以外に3つまで使用してよい。 (5)できた数は、有限の整数に限る。(無限大になる式などはだめ) 私の解は、 3^(3×(3!)!) ですが、もっと大きな数が作れるでしょうか?

  • 120000になる整数

    1から6までのカードを並べて6けたの数をつくり、四捨五入で一万の位までのがい数にしたいとき、120000になる整数を3つおそえてください。

  • 算数整数の問題です

    4けたの整数7AB7が2けたの整数ABでわりきれるとき、ABのうちで、最も大きい数は何ですか 宜しくお願いします

  • 整数の個数について

    整数の個数について 数学の問題集で『3桁の正の整数のうち、3で割ると1余る偶数の個数はいくつか』という問題の解説で、 『3で割ると1余る偶数は、6で割ると4余る数である』とあったのですが、 どう理屈でどう考えるとこれが導き出せるのかがわかりません。どのように考えればよいのでしょうか? 例えば、三桁の正の整数で、3で割り切れる数であり、かつ、偶数(2で割り切れる数)の個数、といった場合には、 3と2の最小公倍数である6の倍数で考えて個数を導けばよいとわかるのですが・・・。 自分でも調べてみて、3で割ると1余る→3X+1か3x-2で表せるなど色々考えてみたのですが、行き詰ってしまいました。 どうかご指南をよろしくおねがいします。

  • エクセルで整数表示と少数表示を混在させたい

    お世話になります。 集計用のファイルを作っています。 整数と、小数点以下1桁、2桁の数値が出てきます。 書式設定で小数点以下2桁まで表示するようにしたら、整数や小数点以下1桁の数値まで120.00とか25.50と表示されてしまい、見にくくなってしまいました。 小数点以下に0がつく場合は無視して、それぞれ120、25.5、3.25のように必要な桁数だけ表示させたいのですが、どうしたらよいでしょうか。

  • nは3桁の正の整数で√n/12が整数になる数は何個

    nは3桁の正の整数で√n/12が整数になる数は何個ですか? この問題の解き方教えてください。

  • 2桁の正の整数について

    問題は 2桁の正の整数で、二乗した数の下2桁がもとの数と同じになるようなものをすべてあげるのですが、 これは2桁だから10から99の数なんですよね? でも,10から99の数を二乗して求めるのはとても時間がかかってしまいます。 簡単な求める方法はありますか? おねがいします

  • 整数の四捨五入のシリアル表示

    整数(上3桁)の四捨五入をシリアル表示させるにはどうしたらよろしいでしょうか? 77,777→78,000

  • 15524→「15520」となるようにするには? 整数下1桁切捨て方法

    整数の下1桁を切り捨てて表示するには関数を使うのでしょうか? 小数点の場合だと関数を使用して対応できたのですが、整数の場合では どのようにすればいいですか?教えてください。

専門家に質問してみよう