Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

cos20°を高精度で計算する

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)