"Olson, Arthur David (NIH/NCI)" <olsona@dc37a.nci.nih.gov> writes:
** If (sizeof (double) > sizeof (time_t)) simply convert and subtract ** (assuming that the wider type has more precision).
This should say "larger" rather than "wider". In C99 standardese, "larger" talks about sizeof, "wider" talks about useful bits (ie. precision).
if (time1 >= 0 && time0 >= 0 || time1 < 0 && time0 < 0)
It'd be nicer, shorter, and often faster to say this: if ((time1 < 0) == (time0 < 0)) and then, for symmetry (and more likelihood for compiler optimization) replace "time1 >= 0 /* && time0 < 0 */" with "time0 < 0 /* && time1 >= 0 */" later on.
** Punt if unsigned long is too narrow.
Why not use uintmax_t if 199901 <= __STDC_VERSION__? That will work on all hosts except the weird ones where unsigned values have holes. The implementation is still a bit slow for the common case where time_t is a signed integer type and fits in double (e.g., x86) or long double (e.g., x86-64). This case should be doable without any tests or branches. It's not a correctness issue; just a performance issue. I sense that you didn't like the version that I sent in, because of its complexity. What part of the complexity turned you off the most? Perhaps I could simplify that part.