#include #include #define false 0 #define true 1 int *p; int *t; int q; void add() { int j; for (j = q; j >= 0; j--) if (t[j] + p[j] > 9) { p[j] += t[j] - 10; p[j-1] += 1; } else p[j] += t[j]; } void sub() { int j; for (j = q; j >= 0; j--) if (p[j] < t[j]) { p[j] -= t[j] -10; p[j-1] -= 1; } else p[j] -= t[j]; } void mul(int multiplier) { int b, i, carry, digit; carry = 0; for (i = q; i >= 0; i--) { b = (t[i] * multiplier + carry); digit = b % 10; carry = b / 10; t[i] = digit; } } void divide(int divisor) { int i, b, quotient, remainder; remainder = 0; for (i = 0; i <= q; i++) { b = (10 * remainder + t[i]); quotient = b / divisor; remainder = b % divisor; t[i] = quotient; } } void div4() { int i, c, d; d = 0; for (i = 0; i <= q; i++) { c = (10 * d + p[i]) / 4; d = (10 * d + p[i]) % 4; p[i] = c; } } void mul4() { int i, c, d; c = 0; for (i = q; i >= 0; i--) { d = (p[i] * 4 + c) % 10; c = (p[i] * 4 + c) / 10; p[i] = d; } } int tiszero() { int k; for (k = 0; k <= q; k++) if (t[k] != 0) return false; return true; } void arctan(int s) { int n; t[0] = 1; divide(s); add(); n = 1; do { mul(n); divide(s * s); divide(n += 2); if (((n-1) / 2) % 2 == 0) add(); else sub(); } while (!tiszero()); } //--------------------------------------------------------------------------- int main(int argc, char **argv) { int n; // Check the arguments if (argc < 2) printf("usage: pi \n"); else { // create the class q = atoi(argv[1]); p = 0; t = 0; p = (int*)calloc(q+1, sizeof(int)); t = (int*)calloc(q+1, sizeof(int)); // Compute PI arctan(2); arctan(3); mul4(); printf("pi = %d.", p[0]); for (n = 1; n < q; n++) printf("%d", p[n]); printf("\n"); free(t); free(p); } return 0; }