Computes simple continued fraction for pi using new framework.
[frac.git] / pi.c
blob656d22042a8ea0dcb13871584659312bf405a135
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <gmp.h>
4 #include "cf.h"
6 static void *pi_arctan_sequence(cf_t cf) {
7 mpz_t num, denom;
8 mpz_init(num);
9 mpz_init(denom);
11 mpz_set_ui(denom, 1);
12 cf_put(cf, denom);
14 mpz_set_ui(num, 1);
15 cf_put(cf, num);
17 while(cf_wait(cf)) {
18 mpz_add_ui(denom, denom, 2);
19 cf_put(cf, denom);
20 mpz_add(num, num, denom);
21 cf_put(cf, num);
24 mpz_clear(num);
25 mpz_clear(denom);
26 return NULL;
29 int main() {
30 mpz_t z;
31 mpz_t a, b, c, d;
32 mpz_init(z);
33 cf_t pi, conv;
34 pi = cf_new(pi_arctan_sequence, NULL);
35 mpz_init(a); mpz_init(b); mpz_init(c); mpz_init(d);
36 mpz_set_ui(a, 0); mpz_set_ui(b, 4);
37 mpz_set_ui(c, 1); mpz_set_ui(d, 0);
39 conv = cf_new_nonregular_to_cf(pi, a, b, c, d);
40 for (int i = 1; i <= 100; i++) {
41 cf_signal(conv);
42 cf_get(z, conv);
43 gmp_printf(" %Zd",z);
45 printf("\n");
46 cf_free(conv);
47 cf_free(pi);
48 mpz_clear(z);
49 mpz_clear(d); mpz_clear(c); mpz_clear(b); mpz_clear(a);
50 return 0;