diff options
author | Christopher Faylor <cgf@redhat.com> | 2000-02-17 19:39:46 +0000 |
---|---|---|
committer | Christopher Faylor <cgf@redhat.com> | 2000-02-17 19:39:46 +0000 |
commit | 6d491d8ad9122891d1a48447e8c49702eb678921 (patch) | |
tree | 45619a131b9f211ceca9fce7a866328344bf00ec /newlib/libm/mathfp/sf_ldexp.c | |
parent | bd592806f45307757c24ec3f75bdefe13abfd51f (diff) | |
download | gdb-6d491d8ad9122891d1a48447e8c49702eb678921.tar.gz |
import newlib-2000-02-17 snapshotcvs/SNAPSHOT
Diffstat (limited to 'newlib/libm/mathfp/sf_ldexp.c')
-rw-r--r-- | newlib/libm/mathfp/sf_ldexp.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/newlib/libm/mathfp/sf_ldexp.c b/newlib/libm/mathfp/sf_ldexp.c new file mode 100644 index 00000000000..6b6c2c00b50 --- /dev/null +++ b/newlib/libm/mathfp/sf_ldexp.c @@ -0,0 +1,81 @@ + +/* @(#)z_ldexpf.c 1.0 98/08/13 */ +/****************************************************************** + * ldexp + * + * Input: + * d - a floating point value + * e - an exponent value + * + * Output: + * A floating point value f such that f = d * 2 ^ e. + * + * Description: + * This function creates a floating point number f such that + * f = d * 2 ^ e. + * + *****************************************************************/ + +#include <float.h> +#include "fdlibm.h" +#include "zmath.h" + +#define FLOAT_EXP_OFFS 127 + +float +_DEFUN (ldexpf, (float, int), + float d _AND + int e) +{ + int exp; + __int32_t wd; + + GET_FLOAT_WORD (wd, d); + + /* Check for special values and then scale d by e. */ + switch (numtestf (wd)) + { + case NAN: + errno = EDOM; + break; + + case INF: + errno = ERANGE; + break; + + case 0: + break; + + default: + exp = (wd & 0x7f800000) >> 23; + exp += e; + + if (exp > FLT_MAX_EXP + FLOAT_EXP_OFFS) + { + errno = ERANGE; + d = z_infinity_f.f; + } + else if (exp < FLT_MIN_EXP + FLOAT_EXP_OFFS) + { + errno = ERANGE; + d = -z_infinity_f.f; + } + else + { + wd &= 0x807fffff; + wd |= exp << 23; + SET_FLOAT_WORD (d, wd); + } + } + + return (d); +} + +#ifdef _DOUBLE_IS_32BITS + +double ldexp (double x, int e) +{ + return (double) ldexpf ((float) x, e); +} + +#endif /* defined(_DOUBLE_IS_32BITS) */ |