|
@@ -0,0 +1,36 @@
|
|
|
+MODULE ObxPi;
|
|
|
+
|
|
|
+ (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Obx/Mod/Pi.odc *)
|
|
|
+ (* DO NOT EDIT *)
|
|
|
+
|
|
|
+ IMPORT Int := Integers, StdLog;
|
|
|
+
|
|
|
+ PROCEDURE Pi* (digits: INTEGER): Int.Integer; (* entier(pi * 10^digits) *)
|
|
|
+ VAR p1, p2, inc, sum: Int.Integer; guard, div: INTEGER;
|
|
|
+ BEGIN
|
|
|
+ (* pi = 16 * atan(1/5) - 4 * atan(1/239) *)
|
|
|
+ (* atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... *)
|
|
|
+ guard := 8;
|
|
|
+ p1 := Int.Quotient(Int.Product(Int.Power(Int.Long(10), digits + guard), Int.Long(16)), Int.Long(5));
|
|
|
+ p2 := Int.Quotient(Int.Product(Int.Power(Int.Long(10), digits + guard), Int.Long(-4)), Int.Long(239));
|
|
|
+ sum := Int.Sum(p1, p2);
|
|
|
+ div := 1;
|
|
|
+ REPEAT
|
|
|
+ p1 := Int.Quotient(p1, Int.Long(-5 * 5));
|
|
|
+ p2 := Int.Quotient(p2, Int.Long(-239 * 239));
|
|
|
+ INC(div, 2);
|
|
|
+ inc := Int.Quotient(Int.Sum(p1, p2), Int.Long(div));
|
|
|
+ sum := Int.Sum(sum, inc)
|
|
|
+ UNTIL Int.Sign(inc) = 0;
|
|
|
+ RETURN Int.Quotient(sum, Int.Power(Int.Long(10), guard))
|
|
|
+ END Pi;
|
|
|
+
|
|
|
+ PROCEDURE WritePi* (digits: INTEGER);
|
|
|
+ VAR i: Int.Integer; s: ARRAY 10000 OF CHAR;
|
|
|
+ BEGIN
|
|
|
+ i := Pi(digits);
|
|
|
+ Int.ConvertToString(i, s);
|
|
|
+ StdLog.String(s); StdLog.Ln
|
|
|
+ END WritePi;
|
|
|
+
|
|
|
+END ObxPi.
|