Thanks!  That gets me exactly what I wanted.  I don't think I would
have been able to locate that code myself.

Based on this code and some quick math it confirms that not only will
the rollover be a looong way out, but that there will not be any loss
in precision until ~ 30 years down the road.  Checking my math:

  (float(10**16 + 1) - float(10**16)) == 0
  (float(10**15 + 1) - float(10**15)) == 1
  ie: our double precision float can resolve unity differences out to
      at least 10**15
  Assuming 1 us/count we have 10**15 us / (3.15E13 us/year) = 31.7 yrs

Past this we won't roll over since the long keeps counting for a long
time, but some precision will be lost.

For those interested, the relevant win32 time code is below.  Thanks
again!

time_clock(PyObject *self, PyObject *args)
{
        static LARGE_INTEGER ctrStart;
        static double divisor = 0.0;
        LARGE_INTEGER now;
        double diff;

        if (!PyArg_ParseTuple(args, ":clock"))
                return NULL;

        if (divisor == 0.0) {
                LARGE_INTEGER freq;
                QueryPerformanceCounter(&ctrStart);
                if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
                        /* Unlikely to happen - this works on all intel
                           machines at least!  Revert to clock() */
                        return PyFloat_FromDouble(clock());
                }
                divisor = (double)freq.QuadPart;
        }
        QueryPerformanceCounter(&now);
        diff = (double)(now.QuadPart - ctrStart.QuadPart);
        return PyFloat_FromDouble(diff / divisor);
}

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to