aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--math/test-misc.c165
-rw-r--r--sysdeps/i386/fpu/s_nextafterl.c7
-rw-r--r--sysdeps/ieee754/ldbl-96/math_ldbl.h4
4 files changed, 142 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index 27a89612f0..b5de469d14 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2000-12-18 Ulrich Drepper <drepper@redhat.com>
+ * math/test-misc.c: Add more tests for nextafter.
+ * sysdeps/i386/fpu/s_nextafterl.c: Handle decrement for x<0 correctly.
+ * sysdeps/ieee754/ldbl-96/math_ldbl.h
+ (ieee_long_double_shape_type): Make sign_exponent element signed.
+
* manual/message.texi: Add Estonian to plural overview list.
Correct rule for Slavic languages.
Patch by Stanislav Brabec <utx@penguin.cz>.
diff --git a/math/test-misc.c b/math/test-misc.c
index 8affd2d5ec..c4f9731413 100644
--- a/math/test-misc.c
+++ b/math/test-misc.c
@@ -114,41 +114,138 @@ main (void)
}
}
- if (fpclassify (FLT_MIN) != FP_NORMAL)
- {
- printf ("fpclassify (FLT_MIN) failed: %d\n", fpclassify (FLT_MIN));
- result = 1;
- }
- if (fpclassify (nextafterf (FLT_MIN, FLT_MIN / 2.0f)) != FP_SUBNORMAL)
- {
- printf ("fpclassify (FLT_MIN-epsilon) failed: %d\n",
- fpclassify (nextafterf (FLT_MIN, FLT_MIN / 2.0f)));
- result = 1;
- }
- if (fpclassify (DBL_MIN) != FP_NORMAL)
- {
- printf ("fpclassify (DBL_MIN) failed: %d\n", fpclassify (DBL_MIN));
- result = 1;
- }
- if (fpclassify (nextafter (DBL_MIN, DBL_MIN / 2.0)) != FP_SUBNORMAL)
- {
- printf ("fpclassify (DBL_MIN-epsilon) failed: %d\n",
- fpclassify (nextafter (DBL_MIN, DBL_MIN / 2.0)));
- result = 1;
- }
+ {
+ float f;
+
+ f = FLT_MIN;
+ if (fpclassify (f) != FP_NORMAL)
+ {
+ printf ("fpclassify (FLT_MIN) failed: %d\n", fpclassify (f));
+ result = 1;
+ }
+ f = nextafterf (f, FLT_MIN / 2.0f);
+ if (fpclassify (f) != FP_SUBNORMAL)
+ {
+ printf ("fpclassify (FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
+ result = 1;
+ }
+ f = nextafterf (f, FLT_MIN);
+ if (fpclassify (f) != FP_NORMAL)
+ {
+ printf ("fpclassify (FLT_MIN-epsilon+epsilong) failed: %d\n",
+ fpclassify (f));
+ result = 1;
+ }
+
+ f = -FLT_MIN;
+ if (fpclassify (f) != FP_NORMAL)
+ {
+ printf ("fpclassify (-FLT_MIN) failed: %d\n", fpclassify (f));
+ result = 1;
+ }
+ f = nextafterf (f, -FLT_MIN / 2.0f);
+ if (fpclassify (f) != FP_SUBNORMAL)
+ {
+ printf ("fpclassify (-FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
+ result = 1;
+ }
+ f = nextafterf (f, -FLT_MIN);
+ if (fpclassify (f) != FP_NORMAL)
+ {
+ printf ("fpclassify (-FLT_MIN-epsilon+epsilong) failed: %d\n",
+ fpclassify (f));
+ result = 1;
+ }
+ }
+ {
+ double d;
+
+ d = DBL_MIN;
+ if (fpclassify (d) != FP_NORMAL)
+ {
+ printf ("fpclassify (DBL_MIN) failed: %d\n", fpclassify (d));
+ result = 1;
+ }
+ d = nextafter (d, DBL_MIN / 2.0);
+ if (fpclassify (d) != FP_SUBNORMAL)
+ {
+ printf ("fpclassify (DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
+ result = 1;
+ }
+ d = nextafter (d, DBL_MIN);
+ if (fpclassify (d) != FP_NORMAL)
+ {
+ printf ("fpclassify (DBL_MIN-epsilon+epsilon) failed: %d\n",
+ fpclassify (d));
+ result = 1;
+ }
+
+ d = -DBL_MIN;
+ if (fpclassify (d) != FP_NORMAL)
+ {
+ printf ("fpclassify (-DBL_MIN) failed: %d\n", fpclassify (d));
+ result = 1;
+ }
+ d = nextafter (d, -DBL_MIN / 2.0);
+ if (fpclassify (d) != FP_SUBNORMAL)
+ {
+ printf ("fpclassify (-DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
+ result = 1;
+ }
+ d = nextafter (d, -DBL_MIN);
+ if (fpclassify (d) != FP_NORMAL)
+ {
+ printf ("fpclassify (-DBL_MIN-epsilon+epsilon) failed: %d\n",
+ fpclassify (d));
+ result = 1;
+ }
+ }
#ifndef NO_LONG_DOUBLE
- if (fpclassify (LDBL_MIN) != FP_NORMAL)
- {
- printf ("fpclassify (LDBL_MIN) failed: %d\n", fpclassify (LDBL_MIN));
- result = 1;
- }
- if (fpclassify (nextafterl (LDBL_MIN, LDBL_MIN / 2.0)) != FP_SUBNORMAL)
- {
- 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;
- }
+ {
+ long double ld;
+
+ ld = LDBL_MIN;
+ if (fpclassify (ld) != FP_NORMAL)
+ {
+ printf ("fpclassify (LDBL_MIN) failed: %d\n", fpclassify (ld));
+ result = 1;
+ }
+ ld = nextafterl (ld, LDBL_MIN / 2.0);
+ if (fpclassify (ld) != FP_SUBNORMAL)
+ {
+ printf ("fpclassify (LDBL_MIN-epsilon) failed: %d (%La)\n",
+ fpclassify (ld), ld);
+ result = 1;
+ }
+ ld = nextafterl (ld, LDBL_MIN);
+ if (fpclassify (ld) != FP_NORMAL)
+ {
+ printf ("fpclassify (LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
+ fpclassify (ld), ld);
+ result = 1;
+ }
+
+ ld = -LDBL_MIN;
+ if (fpclassify (ld) != FP_NORMAL)
+ {
+ printf ("fpclassify (-LDBL_MIN) failed: %d\n", fpclassify (ld));
+ result = 1;
+ }
+ ld = nextafterl (ld, -LDBL_MIN / 2.0);
+ if (fpclassify (ld) != FP_SUBNORMAL)
+ {
+ printf ("fpclassify (-LDBL_MIN-epsilon) failed: %d (%La)\n",
+ fpclassify (ld), ld);
+ result = 1;
+ }
+ ld = nextafterl (ld, -LDBL_MIN);
+ if (fpclassify (ld) != FP_NORMAL)
+ {
+ printf ("fpclassify (-LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
+ fpclassify (ld), ld);
+ result = 1;
+ }
+ }
#endif
if (! isnormal (FLT_MIN))
diff --git a/sysdeps/i386/fpu/s_nextafterl.c b/sysdeps/i386/fpu/s_nextafterl.c
index a905858e76..2943a613e3 100644
--- a/sysdeps/i386/fpu/s_nextafterl.c
+++ b/sysdeps/i386/fpu/s_nextafterl.c
@@ -36,8 +36,9 @@ static char rcsid[] = "$NetBSD: $";
long double x,y;
#endif
{
- int32_t hx,hy,ix,iy;
- u_int32_t lx,ly,esx,esy;
+ u_int32_t hx,hy,ix,iy;
+ u_int32_t lx,ly;
+ int32_t esx,esy;
GET_LDOUBLE_WORDS(esx,hx,lx,x);
GET_LDOUBLE_WORDS(esy,hy,ly,y);
@@ -90,7 +91,7 @@ static char rcsid[] = "$NetBSD: $";
else {
esx -= 1;
hx = hx - 1;
- if (esx > 0)
+ if ((esx&0x7fff) > 0)
hx |= 0x80000000;
}
} else
diff --git a/sysdeps/ieee754/ldbl-96/math_ldbl.h b/sysdeps/ieee754/ldbl-96/math_ldbl.h
index dccc4a1240..1a9b027035 100644
--- a/sysdeps/ieee754/ldbl-96/math_ldbl.h
+++ b/sysdeps/ieee754/ldbl-96/math_ldbl.h
@@ -13,7 +13,7 @@ typedef union
struct
{
unsigned int sign_exponent:16;
- unsigned int empty:16;
+ int empty:16;
u_int32_t msw;
u_int32_t lsw;
} parts;
@@ -30,7 +30,7 @@ typedef union
{
u_int32_t lsw;
u_int32_t msw;
- unsigned int sign_exponent:16;
+ int sign_exponent:16;
unsigned int empty:16;
} parts;
} ieee_long_double_shape_type;