Thu Jul 11 00:22:40 1996 Ulrich Drepper <drepper@cygnus.com>
authorroland <roland>
Fri, 12 Jul 1996 00:38:31 +0000 (00:38 +0000)
committerroland <roland>
Fri, 12 Jul 1996 00:38:31 +0000 (00:38 +0000)
* sysdeps/libm-ieee754/s_frexpl.c: New file.  `long double'
implementation of frexp() function.
* sysdeps/libm-ieee754/s_ldexpl.c: New file.  `long double'
implementation of ldexp() function.

sysdeps/libm-ieee754/s_frexpl.c [new file with mode: 0644]
sysdeps/libm-ieee754/s_ldexpl.c [new file with mode: 0644]

diff --git a/sysdeps/libm-ieee754/s_frexpl.c b/sysdeps/libm-ieee754/s_frexpl.c
new file mode 100644 (file)
index 0000000..7a49bc3
--- /dev/null
@@ -0,0 +1,69 @@
+/* s_frexpl.c -- long double version of s_frexp.c.
+ * Conversion to long double by Ulrich Drepper,
+ * Cygnus Support, drepper@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] = "$NetBSD: $";
+#endif
+
+/*
+ * for non-zero x
+ *     x = frexpl(arg,&exp);
+ * return a long double fp quantity x such that 0.5 <= |x| <1.0
+ * and the corresponding binary exponent "exp". That is
+ *     arg = x*2^exp.
+ * If arg is inf, 0.0, or NaN, then frexpl(arg,&exp) returns arg
+ * with *exp=0.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __STDC__
+static const long double
+#else
+static long double
+#endif
+#if LDBL_MANT_DIG == 64
+two65 =  3.68934881474191032320e+19L; /* 0x4040, 0x80000000, 0x00000000 */
+#else
+# error "Cannot handle this MANT_DIG"
+#endif
+
+
+#ifdef __STDC__
+       long double __frexpl(long double x, int *eptr)
+#else
+       long double __frexpl(x, eptr)
+       long double x; int *eptr;
+#endif
+{
+       u_int32_t se, hx, ix, lx;
+       GET_LDOUBLE_WORDS(se,hx,lx,x);
+       ix = 0x7fff&se;
+       *eptr = 0;
+       if(ix==0x7fff||((ix|hx|lx)==0)) return x;       /* 0,inf,nan */
+       if (ix==0x0000) {               /* subnormal */
+           x *= two65;
+           GET_LDOUBLE_EXP(se,x);
+           ix = se&0x7fff;
+           *eptr = -65;
+       }
+       *eptr += ix-16382;
+       se = (se & 0x8000) | 0x3ffe;
+       SET_LDOUBLE_EXP(x,se);
+       return x;
+}
+weak_alias (__frexpl, frexpl)
diff --git a/sysdeps/libm-ieee754/s_ldexpl.c b/sysdeps/libm-ieee754/s_ldexpl.c
new file mode 100644 (file)
index 0000000..bf64c89
--- /dev/null
@@ -0,0 +1,37 @@
+/* s_ldexpl.c -- long double version of s_ldexp.c.
+ * Conversion to long double by Ulrich Drepper,
+ * Cygnus Support, drepper@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] = "$NetBSD: $";
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#include <errno.h>
+
+#ifdef __STDC__
+       long double __ldexpl(long double value, int exp)
+#else
+       long double __ldexpl(value, exp)
+       long double value; int exp;
+#endif
+{
+       if(!__finitel(value)||value==0.0) return value;
+       value = __scalbnl(value,exp);
+       if(!__finitel(value)||value==0.0) errno = ERANGE;
+       return value;
+}
+weak_alias (__ldexpl, ldexpl)