Pi.txt 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. MODULE ObxPi;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Obx/Mod/Pi.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT Int := Integers, StdLog;
  5. PROCEDURE Pi* (digits: INTEGER): Int.Integer; (* entier(pi * 10^digits) *)
  6. VAR p1, p2, inc, sum: Int.Integer; guard, div: INTEGER;
  7. BEGIN
  8. (* pi = 16 * atan(1/5) - 4 * atan(1/239) *)
  9. (* atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... *)
  10. guard := 8;
  11. p1 := Int.Quotient(Int.Product(Int.Power(Int.Long(10), digits + guard), Int.Long(16)), Int.Long(5));
  12. p2 := Int.Quotient(Int.Product(Int.Power(Int.Long(10), digits + guard), Int.Long(-4)), Int.Long(239));
  13. sum := Int.Sum(p1, p2);
  14. div := 1;
  15. REPEAT
  16. p1 := Int.Quotient(p1, Int.Long(-5 * 5));
  17. p2 := Int.Quotient(p2, Int.Long(-239 * 239));
  18. INC(div, 2);
  19. inc := Int.Quotient(Int.Sum(p1, p2), Int.Long(div));
  20. sum := Int.Sum(sum, inc)
  21. UNTIL Int.Sign(inc) = 0;
  22. RETURN Int.Quotient(sum, Int.Power(Int.Long(10), guard))
  23. END Pi;
  24. PROCEDURE WritePi* (digits: INTEGER);
  25. VAR i: Int.Integer; s: ARRAY 10000 OF CHAR;
  26. BEGIN
  27. i := Pi(digits);
  28. Int.ConvertToString(i, s);
  29. StdLog.String(s); StdLog.Ln
  30. END WritePi;
  31. END ObxPi.