diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | math/test-misc.c | 165 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_nextafterl.c | 7 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/math_ldbl.h | 4 |
4 files changed, 142 insertions, 39 deletions
@@ -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; |