#include #include static long double makefraction (const long double orig, unsigned long long& hi, unsigned long long& lo) { const int maxdepth = 10; const int END = 0; long double work = orig; unsigned long long cf[maxdepth]; int i; for(i = 0; i < maxdepth; ++i) { cf[i] = work; //if(cf[i] > work+1) break; // if overflown. work = 1.0 / (work - cf[i]); } unsigned long long u = cf[--i]; unsigned long long v = 1; while(--i >= END) { unsigned 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.9487437186; long double samples_per_frame = 32000.0 / desired_fps; unsigned long long hi, lo; long double error = makefraction(samples_per_frame, hi,lo); std::printf("Using fraction: %llu/%llu (error=%.12llf)\n", hi,lo, error); unsigned framecounter=0; unsigned long long balance = hi; for(;;) { unsigned nsamples = 2*(balance/lo); balance %= lo; balance += hi; std::printf("Frame %u: %u samples\n", framecounter, nsamples); ++framecounter; } }