<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace"><span style="font-family:arial,sans-serif">On Mon, Oct 16, 2017 at 4:10 PM, Victor Stinner </span><span dir="ltr" style="font-family:arial,sans-serif"><<a href="mailto:victor.stinner@gmail.com" target="_blank">victor.stinner@gmail.com</a>></span><span style="font-family:arial,sans-serif"> wrote:</span><br></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="m_-8415120372282380501m_-5327841294666000864gmail-">2017-10-16 9:46 GMT+02:00 Stephan Houben <<a href="mailto:stephanh42@gmail.com" target="_blank">stephanh42@gmail.com</a>>:<br>
> Hi all,<br>
><br>
> I realize this is a bit of a pet peeve of me, since<br>
> in my day job I sometimes get people complaining that<br>
> numerical data is "off" in the sixteenth significant digit<br>
> (i.e. it was stored as a double).<br>
</span>> (...)<br>
<br>
Oh. As usual, I suck at explaining the rationale. I'm sorry about that.<br>
<br>
The problem is not to know the number of nanoseconds since 1970. The<br>
problem is that you lose precision even on short durations, say less<br>
than 1 minute. The precision loss depends on the reference of the<br>
clock, which can be the UNIX epoch, a reference based on the computer<br>
boot time, a reference based on the process startup time, etc.<br>
<br>
Let's say that your web server runs since 105 days, now you want to<br>
measure how much time it took to render a HTML template and this time<br>
is smaller than 1 ms. In such case, the benchmark lose precision just<br>
because of the float type, not because of the clock resolution.<br>
<br>
That's one use case.<br>
<br>
Another use case is when you have two applications storing time. A<br>
program A writes a timestamp, another program B compares the timestamp<br>
to the current time. To explain the issue, let's say that the format<br>
used to store the timestamp and clock used by program A have a<br>
resolution of 1 nanosecond, whereas the clock used by program B has a<br>
resolution of 1 second.  In that case, there is a window of 1 second<br>
where the time is seen as "created in the future". For example, the<br>
GNU tar program emits a warning in that case ("file created in the<br>
future", or something like that).<br>
<br>
More generally, if you store time with a resolution N and your clock<br>
has resolution P, it's better to have N >= P to prevent bad surprises.<br>
More and more databases and filesystems support storing time with<br><font face="arial, helvetica, sans-serif">
nanosecond resolution.<br></font></blockquote><div><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">​Indeed. And some more on where the precision loss comes from:</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">When you measure time starting from one point, like 1970, the timer reaches large numbers today, like 10**9 seconds. Tiny fractions of a second are especially tiny when compared to a number like that.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">You then need log2(10**9) ~ 30 bits of precision just to get a one-second resolution in your timer. A double-precision (64bit) floating point number has 53 bits of precision in the mantissa, so you end up with 23 bits of precision left for fractions of a second, which means you get a resolution of 1 / 2**23 seconds, which is about 100 ns, which is well in line with the data that Victor provided (~100 ns + overhead = ~200 ns).</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">—Koos</font></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div></div><div><br></div>-- <br><div class="m_-8415120372282380501m_-5327841294666000864gmail_signature">+ Koos Zevenhoven + <a href="http://twitter.com/k7hoven" target="_blank">http://twitter.com/k7hoven</a> +</div>
</div></div>