Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Make nextafter, nexttoward set errno (bug 6799).
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.
  • Loading branch information
Joseph Myers committed Nov 2, 2015
1 parent a922456 commit 85422c2
Show file tree
Hide file tree
Showing 19 changed files with 102 additions and 7 deletions.
37 changes: 37 additions & 0 deletions 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.

Expand Down
2 changes: 1 addition & 1 deletion NEWS
Expand Up @@ -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,
Expand Down
20 changes: 14 additions & 6 deletions math/libm-test.inc
Expand Up @@ -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.
Expand Down Expand Up @@ -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),
Expand Down
3 changes: 3 additions & 0 deletions math/s_nextafter.c
Expand Up @@ -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>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions math/s_nexttowardf.c
Expand Up @@ -20,6 +20,7 @@
* Special cases:
*/

#include <errno.h>
#include <math.h>
#include <math_private.h>
#include <float.h>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/i386/fpu/s_nextafterl.c
Expand Up @@ -26,6 +26,7 @@ static char rcsid[] = "$NetBSD: $";
* Special cases:
*/

#include <errno.h>
#include <math.h>
#include <math_private.h>

Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/i386/fpu/s_nexttoward.c
Expand Up @@ -26,6 +26,7 @@ static char rcsid[] = "$NetBSD: $";
* Special cases:
*/

#include <errno.h>
#include <math.h>
#include <math_private.h>
#include <float.h>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/i386/fpu/s_nexttowardf.c
Expand Up @@ -18,6 +18,7 @@
static char rcsid[] = "$NetBSD: $";
#endif

#include <errno.h>
#include <math.h>
#include <math_private.h>
#include <float.h>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/ieee754/flt-32/s_nextafterf.c
Expand Up @@ -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>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/ieee754/ldbl-128/s_nextafterl.c
Expand Up @@ -24,6 +24,7 @@ static char rcsid[] = "$NetBSD: $";
* Special cases:
*/

#include <errno.h>
#include <math.h>
#include <math_private.h>

Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/ieee754/ldbl-128/s_nexttoward.c
Expand Up @@ -25,6 +25,7 @@ static char rcsid[] = "$NetBSD: $";
* Special cases:
*/

#include <errno.h>
#include <math.h>
#include <math_private.h>
#include <float.h>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/ieee754/ldbl-128/s_nexttowardf.c
Expand Up @@ -18,6 +18,7 @@
static char rcsid[] = "$NetBSD: $";
#endif

#include <errno.h>
#include <math.h>
#include <math_private.h>

Expand Down Expand Up @@ -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;
Expand Down
5 changes: 5 additions & 0 deletions sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c
Expand Up @@ -24,6 +24,7 @@ static char rcsid[] = "$NetBSD: $";
* Special cases:
*/

#include <errno.h>
#include <float.h>
#include <math.h>
#include <math_private.h>
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}
Expand All @@ -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) {
Expand All @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c
Expand Up @@ -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>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c
Expand Up @@ -18,6 +18,7 @@
static char rcsid[] = "$NetBSD: $";
#endif

#include <errno.h>
#include <math.h>
#include <math_private.h>
#include <math_ldbl_opt.h>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/ieee754/ldbl-96/s_nexttoward.c
Expand Up @@ -25,6 +25,7 @@ static char rcsid[] = "$NetBSD: $";
* Special cases:
*/

#include <errno.h>
#include <math.h>
#include <math_private.h>
#include <float.h>
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/ieee754/ldbl-96/s_nexttowardf.c
Expand Up @@ -17,6 +17,7 @@
static char rcsid[] = "$NetBSD: $";
#endif

#include <errno.h>
#include <math.h>
#include <math_private.h>
#include <float.h>
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 85422c2

Please sign in to comment.