This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Set errno for atan2 underflow (bug 16349)


This patch fixes bug 16349, missing errno setting for atan2 underflow,
by adding appropriate checks to the existing wrappers.  (As in other
cases, the __kernel_standard support for calling matherr is considered
to be for existing code expecting existing rules for what's considered
an error, even if those don't correspond to a general logical scheme
for what counts as what kind of error, so __set_errno calls are added
directly without any changes to __kernel_standard.)

Tested x86_64 and x86.

(auto-libm-test-out diffs omitted below.)

2014-03-25  Joseph Myers  <joseph@codesourcery.com>

	[BZ #16349]
	* math/w_atan2.c: Include <errno.h>.
	(__atan2): Set errno for result underflowing to zero.
	* math/w_atan2f.c: Include <errno.h>.
	(__atan2f): Set errno for result underflowing to zero.
	* math/w_atan2l.c: Include <errno.h>.
	(__atan2l): Set errno for result underflowing to zero.
	* math/auto-libm-test-in: Don't allow missing errno for some atan2
	tests.
	* math/auto-libm-test-out: Regenerated.

diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index 7c80192..7ef6b81 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -157,13 +157,12 @@ atan2 -min -max
 atan2 min_subnorm -max
 atan2 -min_subnorm -max
 # Bug 15319: underflow exception may be missing.
-# Bug 16349: errno setting may be missing.
 atan2 1 max missing-underflow
 atan2 -1 max missing-underflow
-atan2 min max missing-underflow missing-errno
-atan2 -min max missing-underflow missing-errno
-atan2 min_subnorm max missing-underflow missing-errno
-atan2 -min_subnorm max missing-underflow missing-errno
+atan2 min max missing-underflow
+atan2 -min max missing-underflow
+atan2 min_subnorm max missing-underflow
+atan2 -min_subnorm max missing-underflow
 
 atanh 0
 atanh -0
diff --git a/math/w_atan2.c b/math/w_atan2.c
index efbf0b3..c56d7b6 100644
--- a/math/w_atan2.c
+++ b/math/w_atan2.c
@@ -20,6 +20,7 @@
  * wrapper atan2(y,x)
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -27,10 +28,15 @@
 double
 __atan2 (double y, double x)
 {
+  double z;
+
   if (__builtin_expect (x == 0.0 && y == 0.0, 0) && _LIB_VERSION == _SVID_)
     return __kernel_standard (y, x, 3); /* atan2(+-0,+-0) */
 
-  return __ieee754_atan2 (y, x);
+  z = __ieee754_atan2 (y, x);
+  if (__glibc_unlikely (z == 0.0 && y != 0.0 && __finite (x)))
+    __set_errno (ERANGE);
+  return z;
 }
 weak_alias (__atan2, atan2)
 #ifdef NO_LONG_DOUBLE
diff --git a/math/w_atan2f.c b/math/w_atan2f.c
index 6967540..e4e90fc 100644
--- a/math/w_atan2f.c
+++ b/math/w_atan2f.c
@@ -20,6 +20,7 @@
  * wrapper atan2f(y,x)
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -27,9 +28,14 @@
 float
 __atan2f (float y, float x)
 {
+  float z;
+
   if (__builtin_expect (x == 0.0f && y == 0.0f, 0) && _LIB_VERSION == _SVID_)
     return __kernel_standard_f (y, x, 103); /* atan2(+-0,+-0) */
 
-  return __ieee754_atan2f (y, x);
+  z = __ieee754_atan2f (y, x);
+  if (__glibc_unlikely (z == 0.0f && y != 0.0f && __finitef (x)))
+    __set_errno (ERANGE);
+  return z;
 }
 weak_alias (__atan2f, atan2f)
diff --git a/math/w_atan2l.c b/math/w_atan2l.c
index f1de1d1..d6498ae 100644
--- a/math/w_atan2l.c
+++ b/math/w_atan2l.c
@@ -20,6 +20,7 @@
  * wrapper atan2l(y,x)
  */
 
+#include <errno.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -27,9 +28,14 @@
 long double
 __atan2l (long double y, long double x)
 {
+  long double z;
+
   if (__builtin_expect (x == 0.0L && y == 0.0L, 0) && _LIB_VERSION == _SVID_)
     return __kernel_standard_l (y, x, 203); /* atan2(+-0,+-0) */
 
-  return __ieee754_atan2l (y, x);
+  z = __ieee754_atan2l (y, x);
+  if (__glibc_unlikely (z == 0.0L && y != 0.0L && __finitel (x)))
+    __set_errno (ERANGE);
+  return z;
 }
 weak_alias (__atan2l, atan2l)

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]