[ruby-list:50259] Re: 有理数型Rationalクラスで扱える限界値は?

From: Masa Sakano <imagine@...>
Date: 2015-11-24 14:16:43 UTC
List: ruby-list #50259
坂野正明です。


On 24 Nov 2015, at 12:49, Yoshiizumi <yoshi@cup.sakura.ne.jp> wrote:
>  教えていただきたいのは、Rationalクラスの分子と分母が巨大な数になっても
> 動作していることは分かりますが、どのくらいまで大きな数を扱えるかというこ
> とです。
>  その限界値を知る方法というのはあるのでしょうか。あるいは、限界値という
> のは特にないのでしょうか。

Ruby の Rationalクラスは、Integerクラスを使って実装されていると
理解しています。Integer は、その実は数が小さいところでは
Fixnumクラス、大きいところでは Bignumクラスとなっていて、
Binumクラスは無限桁のはずです。もちろん、正確には、
メモリの制限があるはずなので、10^9桁を遥かに超えるようならば
考慮する必要があるかも知れません。ただし、それ以前の問題として、
極端に大きな桁の数を扱えば、単純な計算にも恐ろしく時間がかかる
ので、使い物にならないでしょう。

たとえば、以下のようにすることで、1億桁の数字でも期待通りに
動作していることが確認できます。
% ruby -e 'a=("1"*1e8).to_i; b=a+1; p b-a'

# お使いの計算機次第では、1億桁だと時間がかかるかも知れません。
# 1万桁とかならば、現代の計算機ならば問題になることはないでしょう。


ちなみに、Integer が Fixnum と Bignumに分かれているのは、
実用的な実装上の問題として、数が小さい時は(C言語で表現される)整数型を
直接使用した方が、実行速度的にはるかに有利だからだと理解しています。
しかし、Fixnum/Bignum をシームレスに実装するための苦労は尋常では
無かった、と聞いたものでした……(まつもとさんを中心とした開発者の
おかげさまで、大変、快適な言語に仕上っていますね _o_)

ご参考までに。

坂野正明



In This Thread