Let's take the common case where time_t ranges from -2147483648 through 2147483647, and `double' is IEEE 754 double precision. Then, under tz-1994e, the program #include <time.h> #include <stdio.h> #define MAX_TIME 2147483647 #define MIN_TIME (-1 - MAX_TIME) int main() { printf("difftime(%ld, %ld) = %.17g\n", (long) MAX_TIME, (long) MIN_TIME, difftime(MAX_TIME, MIN_TIME)); return 0; } outputs difftime(2147483647, -2147483648) = -1 There's no reason for difftime to report the wrong answer, since the result is exactly representable. Here is a patch. =================================================================== RCS file: difftime.c,v retrieving revision 1994.5 retrieving revision 1994.5.1.1 diff -c -r1994.5 -r1994.5.1.1 *** difftime.c 1992/04/23 17:34:30 1994.5 --- difftime.c 1994/05/03 04:30:43 1994.5.1.1 *************** *** 13,17 **** const time_t time1; const time_t time0; { ! return time1 - time0; } --- 13,28 ---- const time_t time1; const time_t time0; { ! if (sizeof(time_t) < sizeof(double)) ! return (double) time1 - (double) time0; ! else { ! time_t delta = time1 - time0; ! if ((~time1 & time0 & delta) < 0) { ! time_t hibit; ! for (hibit = 1; (hibit <<= 1) > 0; ) ! ; ! return delta - 2.0 * hibit; ! } else ! return delta; ! } }
participants (1)
-
eggert@twinsun.com