1
0
mirror of https://frontier.innolan.net/rainlance/amiga-tz.git synced 2025-11-23 10:30:49 +00:00

Eggert mods

SCCS-file: difftime.c
SCCS-SID: 7.3
This commit is contained in:
Arthur David Olson
1994-05-05 08:29:51 -04:00
committed by Paul Eggert
parent 921fcfda27
commit fd4777f1d5

View File

@ -12,6 +12,13 @@ static char elsieid[] = "%W%";
** Algorithm courtesy Paul Eggert (eggert@twinsun.com).
*/
#ifdef HAVE_LONG_DOUBLE
typedef long double long_double;
#endif /* defined HAVE_LONG_DOUBLE */
#ifndef HAVE_LONG_DOUBLE
typedef double long_double;
#endif /* !defined HAVE_LONG_DOUBLE */
double
difftime(time1, time0)
const time_t time1;
@ -22,10 +29,8 @@ const time_t time0;
if (sizeof(time_t) < sizeof(double))
return (double) time1 - (double) time0;
#ifdef HAVE_LONG_DOUBLE
if (sizeof(time_t) < sizeof(long double))
return (long double) time1 - (long double) time0;
#endif /* defined HAVE_LONG_DOUBLE */
if (sizeof(time_t) < sizeof(long_double))
return (long_double) time1 - (long_double) time0;
if (time1 < time0)
return -difftime(time0, time1);
/*
@ -45,14 +50,14 @@ const time_t time0;
** The following expression rounds twice, which means
** the result may not be the closest to the true answer.
** For example, suppose time_t is 64-bit signed int,
** double is IEEE 754 double with default rounding,
** long_double is IEEE 754 double with default rounding,
** time1 = 9223372036854775807 and time0 = -1536.
** Then the true difference is 9223372036854777343,
** which rounds to 9223372036854777856
** with a total error of 513.
** But delta overflows to -9223372036854774273,
** which rounds to -9223372036854774784, and correcting
** this by subtracting 2 * (double) hibit
** this by subtracting 2 * (long_double) hibit
** (i.e. by adding 2**64 = 18446744073709551616)
** yields 9223372036854776832, which
** rounds to 9223372036854775808
@ -65,5 +70,5 @@ const time_t time0;
** so if time_t is unsigned the "return delta" above
** has the same double-rounding problem.
*/
return delta - 2 * (double) hibit;
return delta - 2 * (long_double) hibit;
}