Rubyで大きな値(数億桁)を扱うときのメモ
ある日。フィボナッチ数列の10億万番目とその前2つの値を計算して、割って黄金比を求めているときのメモ。
nilを代入しないとGCは片付けてくれない
まぁ、メモリがそこまで逼迫することはあまりないと思うけど。
割り算ができない(浮動小数点数にできない)
浮動小数点数に直すとInfinity行っちゃいます。
最初NaNを見た時は「えっ」ってなります。
小数を使いたい時は割られる側に大きな数を掛けておきましょう。
Integer#** の右側に大きな値を置けない
よく引っかかるやつ。
10**10_0000_0000 # なら ([10**(10_0000_0000/100)]*100).inject(:*) # 100の部分は適当に割り切れる数字で
計算に結構な時間がかかるのであれ(
右側の値は100万くらいなら大丈夫っぽい。
Integer(Bignum)#to_s でエラーが出る
to_s
お前もか
`to_s': bignum too big to convert into `string' (RangeError)
はえぇ・・
OKU = ([10**(100_0000)]*100).inject(:*) # ここだけで100秒かかります def very_big_num_to_string n if n < OKU n.to_s else bottom = n % OKU top = n / OKU n = nil very_big_num_to_string(top) << bottom.to_s end end
みたいなメソッドを作っておけばいいです。遅いけど...