]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Make nextafter, nexttoward set errno (bug 6799).
authorJoseph Myers <joseph@codesourcery.com>
Mon, 2 Nov 2015 18:54:19 +0000 (18:54 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Mon, 2 Nov 2015 18:54:19 +0000 (18:54 +0000)
nextafter and nexttoward fail to set errno on overflow and underflow.
This patch makes them do so in cases that should include all the cases
where such errno setting is required by glibc's goals for when to set
errno (but not all cases of underflow where the result is nonzero and
so glibc's goals do not require errno setting).

Tested for x86_64, x86, mips64 and powerpc.

[BZ #6799]
* math/s_nextafter.c: Include <errno.h>.
(__nextafter): Set errno on overflow and underflow.
* math/s_nexttowardf.c: Include <errno.h>.
(__nexttowardf): Set errno on overflow and underflow.
* sysdeps/i386/fpu/s_nextafterl.c: Include <errno.h>.
(__nextafterl): Set errno on overflow and underflow.
* sysdeps/i386/fpu/s_nexttoward.c: Include <errno.h>.
(__nexttoward): Set errno on overflow and underflow.
* sysdeps/i386/fpu/s_nexttowardf.c: Include <errno.h>.
(__nexttowardf): Set errno on overflow and underflow.
* sysdeps/ieee754/flt-32/s_nextafterf.c: Include <errno.h>.
(__nextafterf): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-128/s_nextafterl.c: Include <errno.h>.
(__nextafterl): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-128/s_nexttoward.c: Include <errno.h>.
(__nexttoward): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-128/s_nexttowardf.c: Include <errno.h>.
(__nexttowardf): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c: Include <errno.h>.
(__nextafterl): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c: Include <errno.h>.
(__nexttoward): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c: Include <errno.h>.
(__nexttowardf): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-96/s_nexttoward.c: Include <errno.h>.
(__nexttoward): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-96/s_nexttowardf.c: Include <errno.h>.
(__nexttowardf): Set errno on overflow and underflow.
* sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c: Include <errno.h>.
(__nldbl_nexttowardf): Set errno on overflow and underflow.
* sysdeps/m68k/m680x0/fpu/s_nextafterl.c: Include <errno.h>.
(__nextafterl): Set errno on overflow and underflow.
* math/libm-test.inc (nextafter_test_data): Do not allow errno
setting to be missing on overflow.  Add more tests.
(nexttoward_test_data): Likewise.

19 files changed:
ChangeLog
NEWS
math/libm-test.inc
math/s_nextafter.c
math/s_nexttowardf.c
sysdeps/i386/fpu/s_nextafterl.c
sysdeps/i386/fpu/s_nexttoward.c
sysdeps/i386/fpu/s_nexttowardf.c
sysdeps/ieee754/flt-32/s_nextafterf.c
sysdeps/ieee754/ldbl-128/s_nextafterl.c
sysdeps/ieee754/ldbl-128/s_nexttoward.c
sysdeps/ieee754/ldbl-128/s_nexttowardf.c
sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c
sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c
sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c
sysdeps/ieee754/ldbl-96/s_nexttoward.c
sysdeps/ieee754/ldbl-96/s_nexttowardf.c
sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c
sysdeps/m68k/m680x0/fpu/s_nextafterl.c

index fdd9da4b9838659f007945f8f52937aaaec3b85b..d9c0689b6ac3c63b58e8e8f67c8dac5a7a0f9132 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,42 @@
 2015-11-02  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #6799]
+       * math/s_nextafter.c: Include <errno.h>.
+       (__nextafter): Set errno on overflow and underflow.
+       * math/s_nexttowardf.c: Include <errno.h>.
+       (__nexttowardf): Set errno on overflow and underflow.
+       * sysdeps/i386/fpu/s_nextafterl.c: Include <errno.h>.
+       (__nextafterl): Set errno on overflow and underflow.
+       * sysdeps/i386/fpu/s_nexttoward.c: Include <errno.h>.
+       (__nexttoward): Set errno on overflow and underflow.
+       * sysdeps/i386/fpu/s_nexttowardf.c: Include <errno.h>.
+       (__nexttowardf): Set errno on overflow and underflow.
+       * sysdeps/ieee754/flt-32/s_nextafterf.c: Include <errno.h>.
+       (__nextafterf): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-128/s_nextafterl.c: Include <errno.h>.
+       (__nextafterl): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-128/s_nexttoward.c: Include <errno.h>.
+       (__nexttoward): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-128/s_nexttowardf.c: Include <errno.h>.
+       (__nexttowardf): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c: Include <errno.h>.
+       (__nextafterl): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c: Include <errno.h>.
+       (__nexttoward): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c: Include <errno.h>.
+       (__nexttowardf): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-96/s_nexttoward.c: Include <errno.h>.
+       (__nexttoward): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-96/s_nexttowardf.c: Include <errno.h>.
+       (__nexttowardf): Set errno on overflow and underflow.
+       * sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c: Include <errno.h>.
+       (__nldbl_nexttowardf): Set errno on overflow and underflow.
+       * sysdeps/m68k/m680x0/fpu/s_nextafterl.c: Include <errno.h>.
+       (__nextafterl): Set errno on overflow and underflow.
+       * math/libm-test.inc (nextafter_test_data): Do not allow errno
+       setting to be missing on overflow.  Add more tests.
+       (nexttoward_test_data): Likewise.
+
        * configure.ac (libc_cv_initfini_array): Remove configure test.
        * configure: Regenerated.
 
diff --git a/NEWS b/NEWS
index 654217c49f1c59401bcbf65f480a9bcc654c608e..1cc08a0a7cb8bcbf8372344be4df62919a6043a0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,7 +9,7 @@ Version 2.23
 
 * The following bugs are resolved with this release:
 
-  887, 2542, 2543, 2558, 2898, 4404, 6803, 10432, 14341, 14912, 15367,
+  887, 2542, 2543, 2558, 2898, 4404, 6799, 6803, 10432, 14341, 14912, 15367,
   15384, 15470, 15491, 15786, 15918, 16068, 16141, 16171, 16296, 16347,
   16399, 16415, 16422, 16517, 16519, 16520, 16521, 16620, 16734, 16973,
   16985, 17118, 17243, 17244, 17250, 17404, 17441, 17787, 17886, 17887,
index ace51c977e2f2c7870ac91ea9bdb614db6b0d84e..1267b817e77bed5a100e7560fcb4333f805d363b 100644 (file)
@@ -9850,9 +9850,13 @@ static const struct test_ff_f_data nextafter_test_data[] =
     TEST_ff_f (nextafter, 1.1L, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (nextafter, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
-    /* Bug 6799: errno setting may be missing.  */
-    TEST_ff_f (nextafter, max_value, plus_infty, plus_infty, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION),
-    TEST_ff_f (nextafter, -max_value, minus_infty, minus_infty, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION),
+    TEST_ff_f (nextafter, max_value, plus_infty, plus_infty, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION|ERRNO_ERANGE),
+    TEST_ff_f (nextafter, -max_value, minus_infty, minus_infty, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION|ERRNO_ERANGE),
+
+    TEST_ff_f (nextafter, min_subnorm_value, 0, 0, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
+    TEST_ff_f (nextafter, min_subnorm_value, minus_zero, 0, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
+    TEST_ff_f (nextafter, -min_subnorm_value, 0, minus_zero, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
+    TEST_ff_f (nextafter, -min_subnorm_value, minus_zero, minus_zero, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
 
 #ifdef TEST_LDOUBLE
     // XXX Enable once gcc is fixed.
@@ -9894,9 +9898,13 @@ static const struct test_ff_f_data_nexttoward nexttoward_test_data[] =
     TEST_ff_f (nexttoward, 1.1L, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_ff_f (nexttoward, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
-    /* Bug 6799: errno setting may be missing.  */
-    TEST_ff_f (nexttoward, max_value, plus_infty, plus_infty, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION),
-    TEST_ff_f (nexttoward, -max_value, minus_infty, minus_infty, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION),
+    TEST_ff_f (nexttoward, max_value, plus_infty, plus_infty, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION|ERRNO_ERANGE),
+    TEST_ff_f (nexttoward, -max_value, minus_infty, minus_infty, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION|ERRNO_ERANGE),
+
+    TEST_ff_f (nexttoward, min_subnorm_value, 0, 0, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
+    TEST_ff_f (nexttoward, min_subnorm_value, minus_zero, 0, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
+    TEST_ff_f (nexttoward, -min_subnorm_value, 0, minus_zero, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
+    TEST_ff_f (nexttoward, -min_subnorm_value, minus_zero, minus_zero, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
 
 #ifdef TEST_FLOAT
     TEST_ff_f (nexttoward, 1.0, 1.1L, 0x1.000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
index 28962e52a7e45ca6a61820392b3cfca3b6e7091a..dfa5e860c40f7ae31843d13bd48d183378a4fc6b 100644 (file)
@@ -25,6 +25,7 @@ static char rcsid[] = "$NetBSD: s_nextafter.c,v 1.8 1995/05/10 20:47:58 jtc Exp
 #define __nexttoward __internal___nexttoward
 #define nexttoward __internal_nexttoward
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -72,10 +73,12 @@ double __nextafter(double x, double y)
        if(hy>=0x7ff00000) {
          double u = x+x;       /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00100000) {
            double u = x*x;                     /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+         __set_errno (ERANGE);
        }
        INSERT_WORDS(x,hx,lx);
        return x;
index 06350d47bfd2fcc70ce5957fd4715cfb9908c354..30cd81b454e1a90d67b6b78251ecb990474b68a1 100644 (file)
@@ -20,6 +20,7 @@
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -61,10 +62,12 @@ float __nexttowardf(float x, long double y)
        if(hy>=0x7f800000) {
          float u = x+x;                        /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00800000) {
            float u = x*x;                      /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_FLOAT_WORD(x,hx);
        return x;
index 66d903f80198b2076171c234b5d978b675751e9e..188dc2129a33a4f20040f470451964534211c070 100644 (file)
@@ -26,6 +26,7 @@ static char rcsid[] = "$NetBSD: $";
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -109,10 +110,12 @@ long double __nextafterl(long double x, long double y)
        if(esy==0x7fff) {
            long double u = x + x;      /* overflow  */
            math_force_eval (u);
+           __set_errno (ERANGE);
        }
        if(esy==0) {
            long double u = x*x;                /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_LDOUBLE_WORDS(x,esx,hx,lx);
        return x;
index 839efe6c05232b0d777a24c328760d349ea1cb5c..0b47044760c8016e95b74178a283af72ba54fb2d 100644 (file)
@@ -26,6 +26,7 @@ static char rcsid[] = "$NetBSD: $";
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -75,10 +76,12 @@ double __nexttoward(double x, long double y)
        if(hy>=0x7ff00000) {
          double u = x+x;                       /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00100000) {
            double u = x*x;                     /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        INSERT_WORDS(x,hx,lx);
        return x;
index 29b4f12775a6ba5c759b9541d08f41256a99b797..e1156d1e4fa53ddb52798264c864ceb08da6406a 100644 (file)
@@ -18,6 +18,7 @@
 static char rcsid[] = "$NetBSD: $";
 #endif
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -63,10 +64,12 @@ float __nexttowardf(float x, long double y)
        if(hy>=0x7f800000) {
          float u = x+x;                        /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00800000) {
            float u = x*x;                      /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_FLOAT_WORD(x,hx);
        return x;
index 22e0b3d4ed4231a3f2c2226b7fdab1a5b74a5c7f..625d54b7686f98c2705aadaf83a6fb0d4e9c3c10 100644 (file)
@@ -17,6 +17,7 @@
 static char rcsid[] = "$NetBSD: s_nextafterf.c,v 1.4 1995/05/10 20:48:01 jtc Exp $";
 #endif
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -59,10 +60,12 @@ float __nextafterf(float x, float y)
        if(hy>=0x7f800000) {
          float u = x+x;        /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00800000) {
            float u = x*x;                      /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_FLOAT_WORD(x,hx);
        return x;
index d5eaa1cc912eeea952ff647f85d9ebf25bc3425a..4e9a2ce520f189fc9b3878a3a0907935f6aa096e 100644 (file)
@@ -24,6 +24,7 @@ static char rcsid[] = "$NetBSD: $";
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -70,10 +71,12 @@ long double __nextafterl(long double x, long double y)
        if(hy==0x7fff000000000000LL) {
            long double u = x + x;              /* overflow  */
            math_force_eval (u);
+           __set_errno (ERANGE);
        }
        if(hy==0) {
            long double u = x*x;                /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_LDOUBLE_WORDS64(x,hx,lx);
        return x;
index 2ee7a1be5cf0df992184e70302799f9fff14b1aa..4343fe83f8afed69c692c91c793eee1c9991798e 100644 (file)
@@ -25,6 +25,7 @@ static char rcsid[] = "$NetBSD: $";
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -75,10 +76,12 @@ double __nexttoward(double x, long double y)
        if(hy>=0x7ff00000) {
          double u = x+x;                       /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00100000) {
            double u = x*x;                     /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        INSERT_WORDS(x,hx,lx);
        return x;
index 9c9c7e5283ab9a765b36c842c624a8355f2f718c..8703359d4f948d026b28723441481d5be032ed5e 100644 (file)
@@ -18,6 +18,7 @@
 static char rcsid[] = "$NetBSD: $";
 #endif
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -62,10 +63,12 @@ float __nexttowardf(float x, long double y)
        if(hy>=0x7f800000) {
          float u = x+x;                /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00800000) {
            float u = x*x;              /* underflow */
            math_force_eval (u);        /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_FLOAT_WORD(x,hx);
        return x;
index 36a5090693f609ea46e0d829d6b4e291c107cedf..515aa1ef5bdd417de4fa6e41022257bacc70f982 100644 (file)
@@ -24,6 +24,7 @@ static char rcsid[] = "$NetBSD: $";
  *   Special cases:
  */
 
+#include <errno.h>
 #include <float.h>
 #include <math.h>
 #include <math_private.h>
@@ -69,6 +70,7 @@ long double __nextafterl(long double x, long double y)
            if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL)) {
              u = x+x;  /* overflow, return -inf */
              math_force_eval (u);
+             __set_errno (ERANGE);
              return y;
            }
            if (hx >= 0x7ff0000000000000LL) {
@@ -83,6 +85,7 @@ long double __nextafterl(long double x, long double y)
                  || (hx < 0 && lx > 1)) {
                u = u * u;
                math_force_eval (u);            /* raise underflow flag */
+               __set_errno (ERANGE);
              }
              return x;
            }
@@ -108,6 +111,7 @@ long double __nextafterl(long double x, long double y)
            if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) {
              u = x+x;  /* overflow, return +inf */
              math_force_eval (u);
+             __set_errno (ERANGE);
              return y;
            }
            if ((uint64_t) hx >= 0xfff0000000000000ULL) {
@@ -122,6 +126,7 @@ long double __nextafterl(long double x, long double y)
                  || (hx < 0 && lx >= 0)) {
                u = u * u;
                math_force_eval (u);            /* raise underflow flag */
+               __set_errno (ERANGE);
              }
              if (x == 0.0L)    /* handle negative LDBL_TRUE_MIN case */
                x = -0.0L;
index 8c6119825e9d9fa266caefa9efe49ae5f1e0bf4a..d8f4fc652340f60974089c9347ead3e7d5164395 100644 (file)
@@ -25,6 +25,7 @@ static char rcsid[] = "$NetBSD: $";
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <math_ldbl_opt.h>
@@ -76,10 +77,12 @@ double __nexttoward(double x, long double y)
        if(hy>=0x7ff00000) {
          double u = x+x;                       /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00100000) {
            double u = x*x;                     /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        INSERT_WORDS(x,hx,lx);
        return x;
index 4000a93e690281047c6dcdd18d435f1c66a08d09..7c5d1cc112f9955528bea07ad095a87c5fb0002e 100644 (file)
@@ -18,6 +18,7 @@
 static char rcsid[] = "$NetBSD: $";
 #endif
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <math_ldbl_opt.h>
@@ -65,10 +66,12 @@ float __nexttowardf(float x, long double y)
        if(hy>=0x7f800000) {
          float u = x+x;                /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00800000) {             /* underflow */
            float u = x*x;
            math_force_eval (u);        /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_FLOAT_WORD(x,hx);
        return x;
index 7908f9c0ff6a090f6ec86b2cd939f2ad86676ecb..3d0382eac90b884db4d283d571e496894c57279c 100644 (file)
@@ -25,6 +25,7 @@ static char rcsid[] = "$NetBSD: $";
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -72,10 +73,12 @@ double __nexttoward(double x, long double y)
        if(hy>=0x7ff00000) {
          double u = x+x;                       /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00100000) {
            double u = x*x;                     /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        INSERT_WORDS(x,hx,lx);
        return x;
index 53c527d9ac81e54758017b1d1d0b937e9c0f2c56..ae7538942f49e999fadad32e03d6cba8860b57be 100644 (file)
@@ -17,6 +17,7 @@
 static char rcsid[] = "$NetBSD: $";
 #endif
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <float.h>
@@ -60,10 +61,12 @@ float __nexttowardf(float x, long double y)
        if(hy>=0x7f800000) {
          float u = x+x;                        /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00800000) {
            float u = x*x;                      /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_FLOAT_WORD(x,hx);
        return x;
index dbcf840f2c01c65035358302fb4c8d87bb006138..07e9375b78fed9efb2beb8be0dc3c18104d86246 100644 (file)
@@ -20,6 +20,7 @@
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 #include <math_ldbl_opt.h>
@@ -64,10 +65,12 @@ float __nldbl_nexttowardf(float x, double y)
        if(hy>=0x7f800000) {
          float u = x+x;                        /* overflow  */
          math_force_eval (u);
+         __set_errno (ERANGE);
        }
        if(hy<0x00800000) {
            float u = x*x;                      /* underflow */
            math_force_eval (u);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_FLOAT_WORD(x,hx);
        return x;
index ad77ca4f676bf17318ec3f7a15cf6cf5daaab9fe..c46c0e76ec38d4043e23c948ebf096d940ea319f 100644 (file)
@@ -26,6 +26,7 @@ static char rcsid[] = "$NetBSD: $";
  *   Special cases:
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -92,10 +93,12 @@ long double __nextafterl(long double x, long double y)
        if(esy==0x7fff) {
            long double u = x + x;      /* overflow  */
            math_force_eval (u);
+           __set_errno (ERANGE);
        }
        if(esy==0 && (hx & 0x80000000) == 0) { /* underflow */
            y = x*x;
            math_force_eval (y);                /* raise underflow flag */
+           __set_errno (ERANGE);
        }
        SET_LDOUBLE_WORDS(x,esx,hx,lx);
        return x;