If it helps, avisynth had its own problems with fps and ended up with this function to fix things up:
Code:
// This function uses continued fractions to find the best rational
// approximation that satisfies (denom <= limit). The algorithm
// is from Wikipedia, Continued Fractions.
//
static void reduce_frac(unsigned &num, unsigned &den, unsigned limit)
{
unsigned n0 = 0, n1 = 1, n2, nx = num; // numerators
unsigned d0 = 1, d1 = 0, d2, dx = den; // denominators
unsigned a2, ax, amin; // integer parts of quotients
unsigned f1, f2; // fractional parts of quotients
int i = 0; // number of loop iterations
while (1) { // calculate convergents
a2 = nx / dx;
f2 = nx % dx;
n2 = n0 + n1 * a2;
d2 = d0 + d1 * a2;
if (f2 == 0) break;
if ((i++) && (d2 >= limit)) break;
n0 = n1; n1 = n2;
d0 = d1; d1 = d2;
nx = dx; dx = f1 = f2;
}
if (d2 <= limit)
{
num = n2; den = d2; // use last convergent
}
else { // (d2 > limit)
// d2 = d0 + d1 * ax
// d1 * ax = d2 - d1
ax = (limit - d0) / d1; // set d2 = limit and solve for a2
if ((a2 % 2 == 0) && (d0 * f1 > f2 * d1))
amin = a2 / 2; // passed 1/2 a_k admissibility test
else
amin = a2 / 2 + 1;
if (ax < amin) {
// use previous convergent
num = n1;
den = d1;
}
else {
// calculate best semiconvergent
num = n0 + n1 * ax;
den = d0 + d1 * ax;
}
}
}
Hopefully Intel would be kinder to this one, as well as giving smaller fractions.