require 'bigdecimal' PRECISION = 100 EPSILON = 0.1 ** (PRECISION/2) BigDecimal::limit(PRECISION) def agm(a,g) while a - g > EPSILON a, g = (a+g)/2, (a*g).sqrt(PRECISION) end [a, g] end a = BigDecimal(1) g = 1 / BigDecimal(2).sqrt(PRECISION) puts agm(a, g)