diff options
Diffstat (limited to 'sysdeps/libm-ieee754')
-rw-r--r-- | sysdeps/libm-ieee754/k_standard.c | 42 | ||||
-rw-r--r-- | sysdeps/libm-ieee754/s_fpclassifyf.c | 4 | ||||
-rw-r--r-- | sysdeps/libm-ieee754/w_atan2.c | 2 | ||||
-rw-r--r-- | sysdeps/libm-ieee754/w_atan2f.c | 4 | ||||
-rw-r--r-- | sysdeps/libm-ieee754/w_atan2l.c | 4 |
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 } |