From f95a4a932476be2ba99e2fd081e8d2bc6ea12813 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 15 Dec 2017 09:38:53 -0500 Subject: Import newlib and create makefile --- newlib/libm/mathfp/sf_ldexp.c | 79 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 newlib/libm/mathfp/sf_ldexp.c (limited to 'newlib/libm/mathfp/sf_ldexp.c') 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 +#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) */ -- cgit v1.2.3