diff options
Diffstat (limited to 'math')
-rw-r--r-- | math/libm-test.inc | 20 | ||||
-rw-r--r-- | math/s_nextafter.c | 3 | ||||
-rw-r--r-- | math/s_nexttowardf.c | 3 |
3 files changed, 20 insertions, 6 deletions
diff --git a/math/libm-test.inc b/math/libm-test.inc index ace51c977e..1267b817e7 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -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), diff --git a/math/s_nextafter.c b/math/s_nextafter.c index 28962e52a7..dfa5e860c4 100644 --- a/math/s_nextafter.c +++ b/math/s_nextafter.c @@ -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; diff --git a/math/s_nexttowardf.c b/math/s_nexttowardf.c index 06350d47bf..30cd81b454 100644 --- a/math/s_nexttowardf.c +++ b/math/s_nexttowardf.c @@ -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; |