Fix errno for boundary conditions in 128-bit long double.
authorUlrich Drepper <drepper@redhat.com>
Fri, 29 May 2009 19:00:22 +0000 (12:00 -0700)
committerUlrich Drepper <drepper@redhat.com>
Fri, 29 May 2009 19:00:22 +0000 (12:00 -0700)
Similar to the changes which went already in for the other formats,
follow POSIX rules for errno.

ChangeLog
sysdeps/ieee754/ldbl-128/s_cosl.c
sysdeps/ieee754/ldbl-128/s_expm1l.c
sysdeps/ieee754/ldbl-128/s_sinl.c
sysdeps/ieee754/ldbl-128/s_tanl.c

index 99ff1e3..b1fec55 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2009-05-29  Jakub Jelinek  <jakub@redhat.com>
 
+       * sysdeps/ieee754/ldbl-128/s_expm1l.c: Include <errno.h>.
+       (__expm1l): Set errno to ERANGE on overflow.
+       * sysdeps/ieee754/ldbl-128/s_tanl.c: Include <errno.h>.
+       (__tanl): Set errno to EDOM for ±Inf.
+       * sysdeps/ieee754/ldbl-128/s_cosl.c: Include <errno.h>.
+       (__cosl): Set errno to EDOM for ±Inf.
+       * sysdeps/ieee754/ldbl-128/s_sinl.c: Include <errno.h>.
+       (__sinl): Set errno to EDOM for ±Inf.
+
+2009-05-29  Jakub Jelinek  <jakub@redhat.com>
+
        * sysdeps/s390/s390-32/__longjmp.c (__longjmp): If CHECK_SP is
        defined, use it.
        * sysdeps/s390/s390-64/__longjmp.c (__longjmp): Likewise.
index d1258b2..ef61c3a 100644 (file)
@@ -44,6 +44,7 @@
  *     TRIG(x) returns trig(x) nearly rounded
  */
 
+#include <errno.h>
 #include "math.h"
 #include "math_private.h"
 
          return __kernel_cosl(x,z);
 
     /* cos(Inf or NaN) is NaN */
-       else if (ix>=0x7fff000000000000LL) return x-x;
+       else if (ix>=0x7fff000000000000LL) {
+           if (ix == 0x7fff000000000000LL) {
+               GET_LDOUBLE_LSW64(n,x);
+               if (n == 0)
+                   __set_errno (EDOM);
+           }
+           return x-x;
+       }
 
     /* argument reduction needed */
        else {
index 78bbe65..a82489b 100644 (file)
@@ -53,6 +53,7 @@
 
 
 
+#include <errno.h>
 #include "math.h"
 #include "math_private.h"
 
@@ -121,7 +122,10 @@ __expm1l (long double x)
 
   /* Overflow.  */
   if (x > maxlog)
-    return (big * big);
+    {
+      __set_errno (ERANGE);
+      return (big * big);
+    }
 
   /* Minimum value.  */
   if (x < minarg)
index 446a75f..dc509e7 100644 (file)
@@ -44,6 +44,7 @@
  *     TRIG(x) returns trig(x) nearly rounded
  */
 
+#include <errno.h>
 #include "math.h"
 #include "math_private.h"
 
          return __kernel_sinl(x,z,0);
 
     /* sin(Inf or NaN) is NaN */
-       else if (ix>=0x7fff000000000000LL) return x-x;
+       else if (ix>=0x7fff000000000000LL) {
+           if (ix == 0x7fff000000000000LL) {
+               GET_LDOUBLE_LSW64(n,x);
+               if (n == 0)
+                   __set_errno (EDOM);
+           }
+           return x-x;
+       }
 
     /* argument reduction needed */
        else {
index ea9d053..2349da6 100644 (file)
@@ -44,6 +44,7 @@
  *     TRIG(x) returns trig(x) nearly rounded
  */
 
+#include <errno.h>
 #include "math.h"
 #include "math_private.h"
 
        if(ix <= 0x3ffe921fb54442d1LL) return __kernel_tanl(x,z,1);
 
     /* tanl(Inf or NaN) is NaN */
-       else if (ix>=0x7fff000000000000LL) return x-x;          /* NaN */
+       else if (ix>=0x7fff000000000000LL) {
+           if (ix == 0x7fff000000000000LL) {
+               GET_LDOUBLE_LSW64(n,x);
+               if (n == 0)
+                   __set_errno (EDOM);
+           }
+           return x-x;         /* NaN */
+       }
 
     /* argument reduction needed */
        else {