From 2a9a7d5f92b6f67761b7ee6cdd43ba700af7adf3 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Wed, 28 Mar 1990 13:14:05 +0000 Subject: [PATCH] add LCC - a better C-Compiler for WEGA --- WEGA/contrib/lcc/lib/libc/port/gen/ldexp.c | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 WEGA/contrib/lcc/lib/libc/port/gen/ldexp.c diff --git a/WEGA/contrib/lcc/lib/libc/port/gen/ldexp.c b/WEGA/contrib/lcc/lib/libc/port/gen/ldexp.c new file mode 100644 index 0000000..e34551f --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/port/gen/ldexp.c @@ -0,0 +1,36 @@ +/* + * ldexp(value, exp) returns the quantity value * 2 ** exp. + * In the event of overflow, on UNIX a floating-point exception is signalled. + * In the event of underflow, zero is returned. + * + */ + +#include +#include +/* Largest long int power of 2 */ +#define MAXSHIFT (BITSPERBYTE * sizeof(long) - 2) + +double +ldexp(value, exp) +register double value; +register int exp; +{ + extern double frexp(); + int old_exp; + + if (exp == 0 || value == 0.0) /* nothing to do for zero */ + return (value); + frexp(value, &old_exp); + if (exp > 0) { + if (exp + old_exp > MAXBEXP) /* overflow */ + KILLFPE(); + for ( ; exp > MAXSHIFT; exp -= MAXSHIFT) + value *= (1L << MAXSHIFT); + return (value * (1L << exp)); + } + if (exp + old_exp < MINBEXP) /* underflow */ + return (0.0); + for ( ; exp < -MAXSHIFT; exp += MAXSHIFT) + value *= 1.0/(1L << MAXSHIFT); /* mult faster than div */ + return (value / (1L << -exp)); +}