about summary refs log tree commit diff
path: root/sysdeps/libm-ieee754
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/libm-ieee754')
-rw-r--r--sysdeps/libm-ieee754/k_standard.c42
-rw-r--r--sysdeps/libm-ieee754/s_fpclassifyf.c4
-rw-r--r--sysdeps/libm-ieee754/w_atan2.c2
-rw-r--r--sysdeps/libm-ieee754/w_atan2f.c4
-rw-r--r--sysdeps/libm-ieee754/w_atan2l.c4
5 files changed, 45 insertions, 11 deletions
diff --git a/sysdeps/libm-ieee754/k_standard.c b/sysdeps/libm-ieee754/k_standard.c
index 35026faa9d..ada1df1a99 100644
--- a/sysdeps/libm-ieee754/k_standard.c
+++ b/sysdeps/libm-ieee754/k_standard.c
@@ -18,6 +18,8 @@ static char rcsid[] = "$NetBSD: k_standard.c,v 1.6 1995/05/10 20:46:35 jtc Exp $
 #include "math_private.h"
 #include <errno.h>
 
+#include <assert.h>
+
 #ifndef _USE_WRITE
 #include <stdio.h>			/* fputs(), stderr */
 #define	WRITE2(u,v)	fputs(u, stderr)
@@ -109,7 +111,10 @@ static double zero = 0.0;	/* used as const */
 		exc.type = DOMAIN;
 		exc.name = type < 100 ? "acos" : (type < 200
 						  ? "acosf" : "acosl");;
-		exc.retval = zero;
+		if (_LIB_VERSION == _SVID_)
+		  exc.retval = HUGE;
+		else
+		  exc.retval = NAN;
 		if (_LIB_VERSION == _POSIX_)
 		  __set_errno (EDOM);
 		else if (!__matherr(&exc)) {
@@ -126,7 +131,10 @@ static double zero = 0.0;	/* used as const */
 		exc.type = DOMAIN;
 		exc.name = type < 100 ? "asin" : (type < 200
 						  ? "asinf" : "asinl");
-		exc.retval = zero;
+		if (_LIB_VERSION == _SVID_)
+		  exc.retval = HUGE;
+		else
+		  exc.retval = NAN;
 		if(_LIB_VERSION == _POSIX_)
 		  __set_errno (EDOM);
 		else if (!__matherr(&exc)) {
@@ -145,7 +153,8 @@ static double zero = 0.0;	/* used as const */
 		exc.type = DOMAIN;
 		exc.name = type < 100 ? "atan2" : (type < 200
 						   ? "atan2f" : "atan2l");
-		exc.retval = zero;
+		assert (_LIB_VERSION == _SVID_);
+		exc.retval = HUGE;
 		if(_LIB_VERSION == _POSIX_)
 		  __set_errno (EDOM);
 		else if (!__matherr(&exc)) {
@@ -399,7 +408,7 @@ static double zero = 0.0;	/* used as const */
 		if (_LIB_VERSION == _SVID_)
 		  exc.retval = -HUGE;
 		else
-		  exc.retval = -HUGE_VAL;
+		  exc.retval = NAN;
 		if (_LIB_VERSION == _POSIX_)
 		  __set_errno (EDOM);
 		else if (!__matherr(&exc)) {
@@ -439,7 +448,7 @@ static double zero = 0.0;	/* used as const */
 		if (_LIB_VERSION == _SVID_)
 		  exc.retval = -HUGE;
 		else
-		  exc.retval = -HUGE_VAL;
+		  exc.retval = NAN;
 		if (_LIB_VERSION == _POSIX_)
 		  __set_errno (EDOM);
 		else if (!__matherr(&exc)) {
@@ -500,7 +509,7 @@ static double zero = 0.0;	/* used as const */
 	    case 23:
 	    case 123:
 	    case 223:
-		/* 0**neg */
+		/* -0**neg */
 		exc.type = DOMAIN;
 		exc.name = type < 100 ? "pow" : (type < 200 ? "powf" : "powl");
 		if (_LIB_VERSION == _SVID_)
@@ -516,6 +525,25 @@ static double zero = 0.0;	/* used as const */
 		  __set_errno (EDOM);
 		}
 		break;
+	    case 43:
+	    case 143:
+	    case 243:
+		/* +0**neg */
+		exc.type = DOMAIN;
+		exc.name = type < 100 ? "pow" : (type < 200 ? "powf" : "powl");
+		if (_LIB_VERSION == _SVID_)
+		  exc.retval = zero;
+		else
+		  exc.retval = HUGE_VAL;
+		if (_LIB_VERSION == _POSIX_)
+		  __set_errno (EDOM);
+		else if (!__matherr(&exc)) {
+		  if (_LIB_VERSION == _SVID_) {
+			(void) WRITE2("pow(0,neg): DOMAIN error\n", 25);
+		      }
+		  __set_errno (EDOM);
+		}
+		break;
 	    case 24:
 	    case 124:
 	    case 224:
@@ -842,6 +870,8 @@ static double zero = 0.0;	/* used as const */
 			__set_errno (EDOM);
 		}
 		break;
+
+		/* #### Last used is 43/143/243 ### */
 	}
 	return exc.retval;
 }
diff --git a/sysdeps/libm-ieee754/s_fpclassifyf.c b/sysdeps/libm-ieee754/s_fpclassifyf.c
index 15bcfef4a6..a6b35cfe1b 100644
--- a/sysdeps/libm-ieee754/s_fpclassifyf.c
+++ b/sysdeps/libm-ieee754/s_fpclassifyf.c
@@ -35,8 +35,8 @@ __fpclassifyf (float x)
     retval = FP_ZERO;
   else if (wx < 0x1000000)
     retval = FP_SUBNORMAL;
-  else if (wx == 0x7f000000)
-    retval = wx > 0x7f000000 ? FP_NAN : FP_INFINITE;
+  else if (wx >= 0x7f800000)
+    retval = wx > 0x7f800000 ? FP_NAN : FP_INFINITE;
 
   return retval;
 }
diff --git a/sysdeps/libm-ieee754/w_atan2.c b/sysdeps/libm-ieee754/w_atan2.c
index 3f6032f977..801baa2347 100644
--- a/sysdeps/libm-ieee754/w_atan2.c
+++ b/sysdeps/libm-ieee754/w_atan2.c
@@ -35,7 +35,7 @@ static char rcsid[] = "$NetBSD: w_atan2.c,v 1.6 1995/05/10 20:48:39 jtc Exp $";
 	double z;
 	z = __ieee754_atan2(y,x);
 	if(_LIB_VERSION != _SVID_||__isnan(x)||__isnan(y)) return z;
-	if(x==0.0&&y==0.0) {
+	if(x==0.0&&y==0.0)
 	  return __kernel_standard(y,x,3); /* atan2(+-0,+-0) */
 	return z;
 #endif
diff --git a/sysdeps/libm-ieee754/w_atan2f.c b/sysdeps/libm-ieee754/w_atan2f.c
index 00b2ce7633..09caa06f00 100644
--- a/sysdeps/libm-ieee754/w_atan2f.c
+++ b/sysdeps/libm-ieee754/w_atan2f.c
@@ -37,7 +37,9 @@ static char rcsid[] = "$NetBSD: w_atan2f.c,v 1.3 1995/05/10 20:48:42 jtc Exp $";
 #else
 	float z;
 	z = __ieee754_atan2f(y,x);
-	if(_LIB_VERSION == _IEEE_||__isnanf(x)||__isnanf(y)) return z;
+	if(_LIB_VERSION != _SVID_||__isnanf(x)||__isnanf(y)) return z;
+	if(x==0.0&&y==0.0)
+	  return __kernel_standard(y,x,103); /* atan2(+-0,+-0) */
 	return z;
 #endif
 }
diff --git a/sysdeps/libm-ieee754/w_atan2l.c b/sysdeps/libm-ieee754/w_atan2l.c
index 437a04c760..2897c8c5f9 100644
--- a/sysdeps/libm-ieee754/w_atan2l.c
+++ b/sysdeps/libm-ieee754/w_atan2l.c
@@ -38,7 +38,9 @@ static char rcsid[] = "$NetBSD: $";
 #else
 	long double z;
 	z = __ieee754_atan2l(y,x);
-	if(_LIB_VERSION == _IEEE_||__isnanl(x)||__isnanl(y)) return z;
+	if(_LIB_VERSION != _SVID_||__isnanl(x)||__isnanl(y)) return z;
+	if(x==0.0&&y==0.0)
+	  return __kernel_standard(y,x,203); /* atan2(+-0,+-0) */
 	return z;
 #endif
 }