← Back to context

Comment by Dylan16807

1 year ago

Previous: https://ioactive.com/reverse-engineers-perspective-on-the-bo...

The 47 bit timestamp at 32MHz would explain the duration (Though not why it isn't 33MHz?).

I have a way simpler explanation. IEEE 754 double can only represent integers up to 2^53 without precision loss, so if you naively average two numbers greater than 2^52, you get an erroneous result.

It just so happens that 2^52 nanoseconds is a little bit over 52 days.

I've seen the same thing with AMD CPUs where they hang after ~1042 days which is 2^53 10-nanosecond intervals.

  • This is incorrect. Very incorrect and disastrously so. Drop 0.3 in here: https://www.h-schmidt.net/FloatConverter/IEEE754.html

    You can also drop 524535643, an integer clearly less than 2^53 and is off by 5.

    This is even seen here:

        #include <stdio.h>
    
        int main() {
                float b = 524535643.0f;
                printf("%f", b);
                return 0;
        }
    

    output: 524535648.000000

  • Having done exactly this math for GStreamer bindings in JavaScript (where the built in numeric types are double or nothing), this would also be my prime suspect.