31 lines
553 B
Plaintext
31 lines
553 B
Plaintext
require "big"
|
|
|
|
def pi
|
|
q, r, t, k, n, l = [1, 0, 1, 1, 3, 3].map { |n| BigInt.new(n) }
|
|
dot_written = false
|
|
loop do
|
|
if 4*q + r - t < n*t
|
|
yield n
|
|
unless dot_written
|
|
yield '.'
|
|
dot_written = true
|
|
end
|
|
nr = 10*(r - n*t)
|
|
n = ((10*(3*q + r)) / t) - 10*n
|
|
q *= 10
|
|
r = nr
|
|
else
|
|
nr = (2*q + r) * l
|
|
nn = (q*(7*k + 2) + r*l) / (t*l)
|
|
q *= k
|
|
t *= l
|
|
l += 2
|
|
k += 1
|
|
n = nn
|
|
r = nr
|
|
end
|
|
end
|
|
end
|
|
|
|
pi { |digit_or_dot| print digit_or_dot; STDOUT.flush }
|