diff --git a/pibench.rb b/pibench.rb new file mode 100644 index 0000000..e868261 --- /dev/null +++ b/pibench.rb @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby +# From: http://imetrics.co.jp/math2/Pi-with-Ruby.pdf +require "bigdecimal" +require "benchmark" +result = Benchmark.realtime do + prec = 10 + conv = 6 + a = BigDecimal("1") + b = BigDecimal("1") / BigDecimal("2").sqrt(prec) + t = BigDecimal("1") / 4 + p = BigDecimal("1") + for n in 1..conv do + an = (a + b) / 2 + b = (a * b).sqrt(prec) + t -= p * (an - a) * (an - a) + p *= 2 + a = an + end + puts (a + b) * (a + b) / (4 * t) +end +puts "Time: #{result}s" + +include Math +a=1.0; b=1/sqrt(2); t=1.0/4; p=1.0 +6.times do + an = (a+b)/2 + b = sqrt(a*b) + t -= p*(an-a)*(an-a) + p *= 2 + a = an + p a +end + puts (a + b) * (a + b) / (4.0 * t) diff --git a/taylor.rb b/taylor.rb new file mode 100755 index 0000000..dbc8f3c --- /dev/null +++ b/taylor.rb @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'bigdecimal' + +goal = (ARGV[0]||9999).to_i +if true +pi4 = 0.0 +(0..goal).each do |x| + pi4 += (-1)**x * 1.0/(2*x+1) +end +printf("pi=%.20f\n", 4*pi4) +printf("ep=%.20f\n", Math::PI-4*pi4) +end + +pi4 = 0.0 +goal.step(0, -1) do |x| + pi4 += (-1)**x * 1.0/(2*x+1) +end +printf("pi=%.20f\n", 4*pi4) +printf("ep=%.20f\n", Math::PI-4*pi4) + +pi4 = 0 +bai = 10**20 + +(0..goal).each do |i| + pi4 += (-1)**i * bai/(2*i+1) + #printf("%d\r", i) +end +printf("pi=%.20f\n", 4.0*pi4/bai) +printf("ep=%.20f\n", Math::PI-4.0*pi4/bai)