about summary refs log tree commit diff
path: root/sysdeps/libm-ieee754/s_scalbnl.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-05-30 16:12:42 +0000
committerRoland McGrath <roland@gnu.org>1996-05-30 16:12:42 +0000
commit76060ec0b8b5d6f0a860a94f100dc6e48041bac3 (patch)
treeb4ff1b5370a30a16705239598cb8e98f4b80b9ca /sysdeps/libm-ieee754/s_scalbnl.c
parentc3352e623384fe221743a6d2212c17d9619041ef (diff)
downloadglibc-76060ec0b8b5d6f0a860a94f100dc6e48041bac3.tar.gz
glibc-76060ec0b8b5d6f0a860a94f100dc6e48041bac3.tar.xz
glibc-76060ec0b8b5d6f0a860a94f100dc6e48041bac3.zip
Thu May 30 11:24:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> cvs/libc-960602 cvs/libc-960601 cvs/libc-960531
	* po/header.pot: Replace with exact boilerplate pinard dictates.

	* sysdeps/i386/strtok.S (Lillegal_argument): Remove this code to set
	errno and the check that jumped to it.

	* sysdeps/mach/hurd/Makefile (errnos.d): Use $(sed-remove-objpfx).

Thu May 30 03:21:57 1996  Ulrich Drepper  <drepper@cygnus.com>

	* FAQ: Document need of gperf program for developers.

	* elf/elf.h: Fix typos in comments.

	* libio/stdio.h [!__STRICT_ANSI__ || _POSIX_SOURCE]: Add
        prototypes for `ctermid' and `cuserid'.

	* locale/programs/locale.c: Switch to user selected locale
	before printing variables.

	* math/Makefile [$(long-double-fcts)==yes]: Define long-m-routines
        and long-c-routines.  Only if the `long double' data type is
        available we need to compile the functions.
	(libm-routines): Add $(long-m-routines).
	(routines): Remove isinfl, isnanl.  Use new file s_isinfl and
	s_isnanl instead if `long double' is available.

	* math/math.h: Include <mathcalls.h> again to define `long double'
        functions.

	* math/math_private.h: Define data types, prototypes and access
        macros for `long double'.

	* stdlib/stdlib.h: Add prototypes for `strtoll' and `strtoull'.
	[GCC2 && OPTIMIZE]: Define strto{,u}ll as inline function which
	calls __strto{,u}q_internal.

	* stdlib/strfmon.c: Replace PTR by `void *'.

	* stdlib/strtoq.c: Define strtoll as weak alias.
	* stdlib/strtouq.c: Define strtoull as weak alias.

	* string/tester.c: Correct `strsep' test.

	* sysdeps/generic/strsep.c: Make compatible with BSD version.
        Trailing characters of skip set are not skipped.  In this case
        empty tokens are returned.

	* sysdeps/i386/isinfl.c, sysdeps/i386/isnanl.c,
        sysdeps/ieee754/isinf.c, sysdeps/ieee754/isinfl.c,
        sysdeps/ieee754/isnan.c, sysdeps/ieee754/isnanl.c: Removed.  We
        now use the versions part of libm.

	* sysdeps/i386/strsep.S: Removed.  Generic C version is of
	similar speed.
	* sysdeps/i386/strtok.S: Remove support for `strsep'.

	* sysdeps/libm-i387/e_acosl.S, sysdeps/libm-i387/s_ceill.S,
        sysdeps/libm-i387/s_copysignl.S, sysdeps/libm-i387/s_finitel.S,
        sysdeps/libm-i387/s_floorl.S, sysdeps/libm-i387/s_isinfl.c,
        sysdeps/libm-i387/s_isnanl.c, sysdeps/libm-i387/s_nextafterl.c,
        sysdeps/libm-i387/s_rintl.S, sysdeps/libm-i387/s_significandl.S:
        New i387 specific math functions implementing `long double'
        versions.

	* sysdeps/libm-ieee754/s_ceill.c,
        sysdeps/libm-ieee754/s_copysignl.c,
        sysdeps/libm-ieee754/s_fabsl.c, sysdeps/libm-ieee754/s_finitel.c,
        sysdeps/libm-ieee754/s_floorl.c, sysdeps/libm-ieee754/s_isinfl.c,
        sysdeps/libm-ieee754/s_isnanl.c,
        sysdeps/libm-ieee754/s_nextafterl.c,
        sysdeps/libm-ieee754/s_rintl.c, sysdeps/libm-ieee754/s_scalbnl.c,
        sysdeps/libm-ieee754/s_significandl.c: New generic `long double'
        versions of libm functions.

	* sysdeps/libm-i387/e_exp.S: Add a few comments to explain the
        Intel FPU nonsense.

	* sysdeps/libm-i387/s_ceil.S, sysdeps/libm-i387/s_ceilf.S,
        sysdeps/libm-i387/s_floor.S, sysdeps/libm-i387/s_floorf.S: Correct
        handling of local variables.  The old version created a stack
        frame but stored the values outside.

	* sysdeps/libm-ieee754/s_isinf.c, sysdeps/libm-ieee754/s_isnan.c
        [!NO_LONG_DOUBLE]: Define alias with `long double' versions name.

	* login/pututline_r.c: Include sys/stat.h.  Fix typos.

        according to currently used locale for category LC_CTYPE by
	inet_nsap_ntoa.  Now in <arpa/inet.h>.
        _IO_dup2 to contain complete parameter list.
Diffstat (limited to 'sysdeps/libm-ieee754/s_scalbnl.c')
-rw-r--r--sysdeps/libm-ieee754/s_scalbnl.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/sysdeps/libm-ieee754/s_scalbnl.c b/sysdeps/libm-ieee754/s_scalbnl.c
new file mode 100644
index 0000000000..d00eb88167
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_scalbnl.c
@@ -0,0 +1,71 @@
+/* s_scalbnl.c -- long double version of s_scalbn.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
+
+/*
+ * scalbnl (long double x, int n)
+ * scalbnl(x,n) returns x* 2**n  computed by  exponent
+ * manipulation rather than by actually performing an
+ * exponentiation or a multiplication.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __STDC__
+static const long double
+#else
+static long double
+#endif
+two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
+twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
+huge   = 1.0e+300,
+tiny   = 1.0e-300;
+
+#ifdef __STDC__
+	long double __scalbnl (long double x, int n)
+#else
+	long double __scalbnl (x,n)
+	long double x; int n;
+#endif
+{
+	int32_t k,es,hx,lx;
+	GET_LDOUBLE_WORDS(es,hx,lx,x);
+        k = es&0x7fff;				/* extract exponent */
+        if (k==0) {				/* 0 or subnormal x */
+            if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
+	    x *= two54;
+	    GET_HIGH_WORD(hx,x);
+	    k = ((hx&0x7ff00000)>>20) - 54;
+            if (n< -50000) return tiny*x; 	/*underflow*/
+	    }
+        if (k==0x7ff) return x+x;		/* NaN or Inf */
+        k = k+n;
+        if (k >  0x7fe) return huge*__copysign(huge,x); /* overflow  */
+        if (k > 0) 				/* normal result */
+	    {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
+        if (k <= -54)
+            if (n > 50000) 	/* in case integer overflow in n+k */
+		return huge*__copysign(huge,x);	/*overflow*/
+	    else return tiny*__copysign(tiny,x); 	/*underflow*/
+        k += 54;				/* subnormal result */
+	SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
+        return x*twom54;
+}
+weak_alias (__scalbnl, scalbnl)