diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:38:53 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:39:34 -0500 |
commit | f95a4a932476be2ba99e2fd081e8d2bc6ea12813 (patch) | |
tree | 75f67192cb2d7b7b575c94edda318e475239b63c /newlib/libm/mathfp/sf_ldexp.c | |
parent | f60aca96985e68c7d8a52eb7bc955fb80e132f73 (diff) |
Import newlib and create makefile
Diffstat (limited to 'newlib/libm/mathfp/sf_ldexp.c')
-rw-r--r-- | newlib/libm/mathfp/sf_ldexp.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/newlib/libm/mathfp/sf_ldexp.c b/newlib/libm/mathfp/sf_ldexp.c new file mode 100644 index 0000000..753be06 --- /dev/null +++ b/newlib/libm/mathfp/sf_ldexp.c @@ -0,0 +1,79 @@ + +/* @(#)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" + +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 + 127)) + { + errno = ERANGE; + d = z_infinity_f.f; + } + else if (exp < FLT_MIN_EXP - 127) + { + 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) */ |