// Code by Hale F. Trotter to fractionalize a decimal value // Converted to C by Alex Kontorovich, 4/20/02 int fractionestimate (double x, int *num, int *den, double tol) /*{given a double x , computes longints num and den and} {returns true if num/den is a rational number in lowest} {terms that is a good rational approximation to x .} */ { double //tol = 1e-9, //{ x is treated as 0 if |x| < tol } acc = 0.9e-3, //{returns false if |x| > maxlongint/2 or } //{ |x - num/den| > acc*abs(x) + tol} crit = 1.0/tol, // {limit on how large numbers are allowed to get} // halfmaxlong = 1073741823.5, //; {half of maxlongint} w, y, qr, tr; int qi, ti; *num = 1; *den = 0; w = fabs(x); qr = (int)(w); //{rounds a double to int} y = 1.0; while (qr * abs(*den) < crit) //{don't let things get out of hand} { qi = (int)(qr); tr = y; y = w - qi * y; w = tr; ti = *den; *den = *num - qi * (*den); *num = ti; if (fabs(y) < tol) qr = crit; else qr = w / y; } *den = abs(*den); *num = (int)(*den * x); return (fabs(x - (*num) / (*den)) <= acc * fabs(x) + tol); }