diff options
Diffstat (limited to 'REORG.TODO/sysdeps/ieee754/dbl-64/s_logb.c')
-rw-r--r-- | REORG.TODO/sysdeps/ieee754/dbl-64/s_logb.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/ieee754/dbl-64/s_logb.c b/REORG.TODO/sysdeps/ieee754/dbl-64/s_logb.c new file mode 100644 index 0000000000..3a26b18f78 --- /dev/null +++ b/REORG.TODO/sysdeps/ieee754/dbl-64/s_logb.c @@ -0,0 +1,52 @@ +/* @(#)s_logb.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* + * double logb(x) + * IEEE 754 logb. Included to pass IEEE test suite. Not recommend. + * Use ilogb instead. + */ + +#include <math.h> +#include <math_private.h> +#include <fix-int-fp-convert-zero.h> + +double +__logb (double x) +{ + int32_t lx, ix, rix; + + EXTRACT_WORDS (ix, lx, x); + ix &= 0x7fffffff; /* high |x| */ + if ((ix | lx) == 0) + return -1.0 / fabs (x); + if (ix >= 0x7ff00000) + return x * x; + if (__glibc_unlikely ((rix = ix >> 20) == 0)) + { + /* POSIX specifies that denormal number is treated as + though it were normalized. */ + int ma; + if (ix == 0) + ma = __builtin_clz (lx) + 32; + else + ma = __builtin_clz (ix); + rix -= ma - 12; + } + if (FIX_INT_FP_CONVERT_ZERO && rix == 1023) + return 0.0; + return (double) (rix - 1023); +} +weak_alias (__logb, logb) +#ifdef NO_LONG_DOUBLE +strong_alias (__logb, __logbl) weak_alias (__logb, logbl) +#endif |