「cos20°を高精度で計算する - 桃の天然水」を読んでRubyで書いてみました。BigDecimalクラスを使うのは初めてなので、おかしな書き方をしているかもしれまん。Pythonで書かれた1行1行を、大体Rubyにすることができました。
formatがそのまま使えたのには驚いたのですが、正直な所、"%%.%df"の意味が理解できていません…。謎が解けました。formatをprintしてみて分かりました…。
require 'bigdecimal' N = 50 EPS = 1 / BigDecimal((10 ** (N + 1)).to_s) def bisection(f, first, last) mid = (first + last) / 2 if last - first < EPS return mid elsif f.call(mid) > 0 return bisection(f, first, mid) else return bisection(f, mid, last) end end f = -> x { (8 * x * x - 6) * x - 1 } format = "%%.%df\n" % N print format % bisection(f, BigDecimal("0"), BigDecimal("1"))
実行結果はPython版と同じで以下のように得られます。
0.93969262078590842790504211734514683485031127929688
また、BigMath.cosも用意されているようですね。これを使っても上記と同様な結果を得ることができました。
require 'bigdecimal/math' include BigMath N = 50 theta = BigDecimal((20.0 * PI(N) / 180.0).to_s) format = "%%.%df\n" % N print format % cos(theta, N)