[robocup-small] New Referee Box Protocol

Christopher Head chead at chead.ca
Fri Nov 9 18:18:32 EST 2012


Well, technically the OS gives it as nanoseconds. I didn’t want to go
with uint64 nanoseconds because it would only be a few bits away from a
32-bit time_t which suffers from the 2038 bug (admittedly it would be a
few orders of binary magnitude, but still). Then Joydeep implied he
thought milliseconds were not as fine as they could be. I like the
tradeoff of using microseconds though! Joydeep, what do you think? (or
anyone else)

Chris

On Fri, 9 Nov 2012 13:55:44 -0800
Ben Johnson <circuitben at gmail.com> wrote:

> I am in favor of using integers for time.
> If we use floating-point seconds, we have a potential rounding error
> because we need so much dynamic range.  Because 1e-6 can't be
> represented exactly in a float64, adding one microsecond to a time
> produces an incorrect result (see the demonstration code below).
> 
> If we use floating-point microseconds, that is no better than integer
> microseconds, but with a less elegant implementation.  Vision uses
> integer microseconds in a uint64, and timing matters much more for
> vision than for referee messages.
> 
> A double doesn't give significantly better resolution than one
> microsecond (less than two bits), and since it can't actually
> represent one microsecond exactly, I would argue that it's worse.  It
> introduces rounding error without any advantage.
> Referee messages except for time remaining are inherently
> high-latency, because they pass through two humans before they reach
> the computer. Extremely high precision is not necessary.
> If for some reason we actually need better resolution, I would suggest
> adding more bits as another field.  The purpose of floating-point
> formats is to provide a variable exponent, which we don't need here.
> 
> It's easy to convert to a double on the receiving side, but it's hard
> to fix rounding errors after the fact.  I would rather see the time
> exactly as the OS originally gave it.
> 
> Rounding demonstration:
> #include <stdio.h>
> #include <sys/time.h>
> 
> int main()
> {
>     struct timeval tv;
>     gettimeofday(&tv, 0);
> 
>     double t0 = tv.tv_sec + tv.tv_usec * 1.0e-6;
>     double t1 = t0 + 1.0e-6;
>     printf("%g\n", t1 - t0);
> 
>     return 0;
> }


More information about the robocup-small mailing list