#include static long double makefraction (long double a, int maxdepth, unsigned long long& hi, unsigned long long& lo) { const long long END = 0; const long double orig = a; long long cf[maxdepth]; long long i,u,v, last; for(i = 0; i < maxdepth; 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; u = cf[last]; v = 1; for(i = last-1; i >= END; i--) { long long w = cf[i] * u + v; v = u; u = w; } hi = u; lo = v; return orig - (u/(long double)v); } int main() { long double desired_fps = 59.950000; long double samples_per_frame = 64000.0 / desired_fps; unsigned long long hi, lo; long double error = makefraction(samples_per_frame, 10, hi,lo); /* This is an application of bresenham's line-drawing algorithm. */ signed long long d = hi - lo*2; unsigned long long dinc1 = lo*2; unsigned long long dinc2 = (lo-hi)*2; std::printf("Using fraction: %llu/%llu (error=%.12llf)\n", hi,lo, error); unsigned framecounter=0; for(;;) { unsigned nsamples = 1; while(d > 0) { ++nsamples; d -= dinc1; } d -= dinc2; std::printf("Frame %u: %u samples\n", framecounter, nsamples); ++framecounter; } }