RosettaCodeData/Task/Pi/Nim/pi.nim

51 lines
714 B
Nim

import strutils, bigints
var
tmp1, tmp2, tmp3, acc, k, dd = initBigInt(0)
den, num, k2 = initBigInt(1)
proc extractDigit(): int32 =
if num > acc:
return -1
tmp3 = num shl 1
tmp3 += num
tmp3 += acc
tmp2 = tmp3 mod den
tmp1 = tmp3 div den
tmp2 += num
if tmp2 >= den:
return -1
result = int32(tmp1.limbs[0])
proc eliminateDigit(d: int32) =
acc -= den * d
acc *= 10
num *= 10
proc nextTerm() =
k += 1
k2 += 2
tmp1 = num shl 1
acc += tmp1
acc *= k2
den *= k2
num *= k
var i = 0
while true:
var d: int32 = -1
while d < 0:
nextTerm()
d = extractDigit()
stdout.write chr(ord('0') + d)
inc i
if i == 40:
echo ""
i = 0
eliminateDigit d