AGM_calculate_pi.sf 704 B

1234567891011121314151617181920212223242526272829303132333435
  1. #!/usr/bin/ruby
  2. # The AGM method for efficiently computing an arbitrary number of digits of PI.
  3. # See also:
  4. # https://rosettacode.org/wiki/Arithmetic-geometric_mean/Calculate_Pi
  5. # https://en.wikipedia.org/wiki/Arithmetic%E2%80%93geometric_mean#The_number_%CF%80
  6. func AGM_PI(digits=100) {
  7. var acc = 8+digits
  8. local Number!PREC = numify(4*digits)
  9. var (an, bn, tn, pn) = (1, sqrt(1/2), 1/4, 1)
  10. while (pn < acc) {
  11. var prev_an = an
  12. an += bn
  13. an /= 2
  14. bn *= prev_an
  15. bn.sqrt!
  16. prev_an -= an
  17. tn -= (prev_an * prev_an * pn)
  18. pn += pn
  19. }
  20. an += bn
  21. an *= an
  22. an /= 4*tn
  23. return String(an)
  24. }
  25. say AGM_PI(ARGV[0])