Convergent computation in new framework.
[frac.git] / cf_converge.c
blob2522662a8be1f474127143c15acf4740cc129313
1 #include <stdio.h>
2 #include <gmp.h>
3 #include "cf.h"
5 static void *convergent(cf_t cf) {
6 cf_t input = cf_data(cf);
7 mpz_t pold, p, pnew;
8 mpz_t qold, q, qnew;
9 mpz_init(pold); mpz_init(p); mpz_init(pnew);
10 mpz_init(qold); mpz_init(q); mpz_init(qnew);
11 mpz_set_ui(pold, 0); mpz_set_ui(p, 1);
12 mpz_set_ui(qold, 1); mpz_set_ui(q, 0);
13 mpz_t denom;
14 mpz_init(denom);
15 while(cf_wait(cf)) {
16 cf_signal(input);
17 cf_get(denom, input);
18 mpz_mul(pnew, p, denom);
19 mpz_add(pnew, pnew, pold);
20 mpz_mul(qnew, q, denom);
21 mpz_add(qnew, qnew, qold);
23 cf_put(cf, pnew);
24 cf_put(cf, qnew);
25 mpz_set(pold, p); mpz_set(p, pnew);
26 mpz_set(qold, q); mpz_set(q, qnew);
28 mpz_clear(denom);
29 mpz_clear(pold); mpz_clear(p); mpz_clear(pnew);
30 mpz_clear(qold); mpz_clear(q); mpz_clear(qnew);
31 return NULL;
33 cf_t cf_new_convergent(cf_t a) {
34 return cf_new(convergent, a);