From cc46d0cfcf056cd46a99b6c9051291da31764c58 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 19 Dec 2000 05:07:31 +0000 Subject: [PATCH] Update. * 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. --- ChangeLog | 5 ++ math/test-misc.c | 165 ++++++++++++++++++++++++++++-------- sysdeps/i386/fpu/s_nextafterl.c | 7 +- sysdeps/ieee754/ldbl-96/math_ldbl.h | 4 +- 4 files changed, 142 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index 27a8961..b5de469 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2000-12-18 Ulrich Drepper + * 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 . diff --git a/math/test-misc.c b/math/test-misc.c index 8affd2d..c4f9731 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 a905858..2943a61 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 dccc4a1..1a9b027 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; -- 2.7.4