summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--math/test-misc.c49
-rw-r--r--math/w_scalb.c2
-rw-r--r--math/w_scalbf.c2
-rw-r--r--math/w_scalbl.c2
-rw-r--r--sysdeps/i386/fpu/e_scalb.S6
-rw-r--r--sysdeps/i386/fpu/e_scalbf.S6
-rw-r--r--sysdeps/i386/fpu/e_scalbl.S6
8 files changed, 76 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 23a2cd9a02..8d399f5b48 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2000-12-04 Ulrich Drepper <drepper@redhat.com>
+ * sysdeps/i386/fpu/e_scalb.S: Handle NaN as first parameter correctly.
+ * sysdeps/i386/fpu/e_scalbf.S: Likewise.
+ * sysdeps/i386/fpu/e_scalbl.S: Likewise.
+ * math/w_scalb.c: Don't use matherr except in SVID mode.
+ * math/w_scalbf.c: Likewise.
+ * math/w_scalbl.c: Likewise.
+ * math/test-misc.c: Add test for NaN and scalbl.
+ Reported by Fred J. Tydeman <tydeman@tybor.com>.
+
+2000-12-04 Ulrich Drepper <drepper@redhat.com>
+
* configure.in: Define HAVE_ASM_GLOBAL_DOT_NAME for AIX.
* config.h.in: Add HAVE_ASM_GLOBAL_DOT_NAME.
* include/libc-symbols.h (strong_alias): Define special version
diff --git a/math/test-misc.c b/math/test-misc.c
index 098695f73f..514035554c 100644
--- a/math/test-misc.c
+++ b/math/test-misc.c
@@ -19,6 +19,7 @@
#include <math.h>
#include <stdio.h>
+#include <string.h>
int
@@ -75,6 +76,26 @@ main (void)
}
}
# endif
+
+#if 0
+ {
+ int e;
+ long double r = frexpl (LDBL_MIN * LDBL_EPSILON, &e);
+
+ if (r != 0.5)
+ {
+ printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): mantissa wrong: %Lg\n",
+ r);
+ result = 1;
+ }
+ else if (e != -16444)
+ {
+ printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): exponent wrong: %d\n",
+ e);
+ result = 1;
+ }
+ }
+#endif
#endif
{
@@ -120,8 +141,9 @@ main (void)
}
if (fpclassify (nextafterl (LDBL_MIN, LDBL_MIN / 2.0)) != FP_SUBNORMAL)
{
- printf ("fpclassify (LDBL_MIN-epsilon) failed: %d\n",
- fpclassify (nextafterl (LDBL_MIN, LDBL_MIN / 2.0)));
+ printf ("fpclassify (LDBL_MIN-epsilon) failed: %d (%Lg)\n",
+ fpclassify (nextafterl (LDBL_MIN, LDBL_MIN / 2.0)),
+ nextafterl (LDBL_MIN, LDBL_MIN / 2.0));
result = 1;
}
#endif
@@ -161,6 +183,29 @@ main (void)
result = 1;
}
}
+
+ /* Special NaNs in x86 long double. Test for scalbl. */
+ {
+ union
+ {
+ char b[10];
+ long double d;
+ } u =
+ { .b = { 0, 1, 0, 0, 0, 0, 0, 0xc0, 0xff, 0x7f } };
+ long double r;
+
+ r = scalbl (u.d, 0.0);
+ if (!isnan (r))
+ {
+ puts ("scalbl(NaN, 0) does not return NaN");
+ result = 1;
+ }
+ else if (memcmp (&r, &u.d, sizeof (double)) != 0)
+ {
+ puts ("scalbl(NaN, 0) does not return the same NaN");
+ result = 1;
+ }
+ }
#endif
return result;
diff --git a/math/w_scalb.c b/math/w_scalb.c
index e5c407a435..c981b858a9 100644
--- a/math/w_scalb.c
+++ b/math/w_scalb.c
@@ -45,7 +45,7 @@ static char rcsid[] = "$NetBSD: w_scalb.c,v 1.6 1995/05/10 20:49:48 jtc Exp $";
#else
double z;
z = __ieee754_scalb(x,fn);
- if(_LIB_VERSION == _IEEE_) return z;
+ if(_LIB_VERSION != _SVID_) return z;
if(!(__finite(z)||__isnan(z))&&__finite(x)) {
return __kernel_standard(x,(double)fn,32); /* scalb overflow */
}
diff --git a/math/w_scalbf.c b/math/w_scalbf.c
index 488a717503..51056083e8 100644
--- a/math/w_scalbf.c
+++ b/math/w_scalbf.c
@@ -48,7 +48,7 @@ static char rcsid[] = "$NetBSD: w_scalbf.c,v 1.3 1995/05/10 20:49:50 jtc Exp $";
#else
float z;
z = __ieee754_scalbf(x,fn);
- if(_LIB_VERSION == _IEEE_) return z;
+ if(_LIB_VERSION != _SVID_) return z;
if(!(__finitef(z)||__isnanf(z))&&__finitef(x)) {
/* scalbf overflow */
return (float)__kernel_standard((double)x,(double)fn,132);
diff --git a/math/w_scalbl.c b/math/w_scalbl.c
index 3ca8d9601d..6a7d307104 100644
--- a/math/w_scalbl.c
+++ b/math/w_scalbl.c
@@ -49,7 +49,7 @@ static char rcsid[] = "$NetBSD: $";
#else
long double z;
z = __ieee754_scalbl(x,fn);
- if(_LIB_VERSION == _IEEE_) return z;
+ if(_LIB_VERSION != _SVID_) return z;
if(!(__finitel(z)||__isnanl(z))&&__finitel(x)) {
return __kernel_standard(x,(double)fn,232); /* scalb overflow */
}
diff --git a/sysdeps/i386/fpu/e_scalb.S b/sysdeps/i386/fpu/e_scalb.S
index 7ff5541e2f..f463002617 100644
--- a/sysdeps/i386/fpu/e_scalb.S
+++ b/sysdeps/i386/fpu/e_scalb.S
@@ -50,7 +50,7 @@ ENTRY(__ieee754_scalb)
fnstsw
andl $0x4500, %eax
cmpl $0x0100, %eax
- je 2f
+ je 3f
fld %st(1)
frndint
fcomp %st(2)
@@ -91,4 +91,8 @@ ENTRY(__ieee754_scalb)
#endif
fldl MO(nan)
ret
+
+ /* The first parameter is a NaN. Return it. */
+3: fstp %st(1)
+ ret
END(__ieee754_scalb)
diff --git a/sysdeps/i386/fpu/e_scalbf.S b/sysdeps/i386/fpu/e_scalbf.S
index 4222eecc97..4b5b0d07b3 100644
--- a/sysdeps/i386/fpu/e_scalbf.S
+++ b/sysdeps/i386/fpu/e_scalbf.S
@@ -52,7 +52,7 @@ ENTRY(__ieee754_scalbf)
fnstsw
andl $0x4500, %eax
cmpl $0x0100, %eax
- je 2f
+ je 3f
fld %st(1)
frndint
fcomp %st(2)
@@ -93,4 +93,8 @@ ENTRY(__ieee754_scalbf)
#endif
fldl MO(nan)
ret
+
+ /* The first parameter is a NaN. Return it. */
+3: fstp %st(1)
+ ret
END(__ieee754_scalbf)
diff --git a/sysdeps/i386/fpu/e_scalbl.S b/sysdeps/i386/fpu/e_scalbl.S
index 56cc833a56..e8166fa9d5 100644
--- a/sysdeps/i386/fpu/e_scalbl.S
+++ b/sysdeps/i386/fpu/e_scalbl.S
@@ -52,7 +52,7 @@ ENTRY(__ieee754_scalbl)
fnstsw
andl $0x4500, %eax
cmpl $0x0100, %eax
- je 2f
+ je 3f
fld %st(1)
frndint
fcomp %st(2)
@@ -93,4 +93,8 @@ ENTRY(__ieee754_scalbl)
#endif
fldl MO(nan)
ret
+
+ /* The first parameter is a NaN. Return it. */
+3: fstp %st(1)
+ ret
END(__ieee754_scalbl)