/* #include #include */ #include long double strtold(const char *s, char **sret); #define END 0 /* 0 or 1 */ static int makefraction(long double a, int maxdepth) { const long double orig = a; long long cf[32]; //maxdepth]; long long u,v; int i, last; long double error; if(maxdepth > 32) { printf("Too much depth\n"); return 0; } for(i = 0; i < maxdepth; ++i) { cf[i] = a; /*printf("cf[%i] = %i, a = %.20f\n", i, cf[i], a);*/ if(cf[i]-1 > cf[i])break; a = 1.0/(a - cf[i]); } for(last=i-1; i < maxdepth; ++i) cf[i] = 0; /*printf("last=%i\n", last);*/ u = cf[last]; v = 1; for(i = last-1; i >= END; --i) { long long w = cf[i] * u + v; v = u; u = w; } printf("depth=%d; ", maxdepth); if (END == 0) { char Format[64]; error = orig - (u/(long double)v); sprintf(Format, "%%Ld/%%Ld - error = %%.%dLf\n", maxdepth+9); printf(Format,u,v, error); } else { printf("%Ld+%Ld/%Ld\n",cf[0],v,u); } if(error == 0.0)return 1; return 0; } int main(int argc, char** argv) { int depth; long double a = 3.141592653589793238462643383L; if(argc == 2) a = strtold(argv[1], NULL); for(depth=1; depth<25; ++depth) { /*makefraction(a, depth);*/ if(makefraction(a, depth)) break; } return 0; }