diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-04-27 14:33:59 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2009-04-27 14:33:59 +0000 |
commit | 83489168c2447e3fe351dbb302b1026dc9fc512c (patch) | |
tree | 8c0029fbf2d97cd352310c6a793bb15745a24ec4 /sysdeps/ieee754 | |
parent | 51211e710a024163f91ffd5ed29908faa3cd41e7 (diff) |
Updated to fedora-glibc-20090427T1419cvs/fedora-glibc-2_9_90-22
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_expm1.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_sin.c | 15 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_tan.c | 31 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_cosf.c | 9 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_expm1f.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_sinf.c | 9 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_tanf.c | 9 | ||||
-rw-r--r-- | sysdeps/ieee754/k_standard.c | 10 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_cosl.c | 7 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_sinl.c | 7 |
10 files changed, 82 insertions, 27 deletions
diff --git a/sysdeps/ieee754/dbl-64/s_expm1.c b/sysdeps/ieee754/dbl-64/s_expm1.c index bfd15b2e31..324354336e 100644 --- a/sysdeps/ieee754/dbl-64/s_expm1.c +++ b/sysdeps/ieee754/dbl-64/s_expm1.c @@ -112,6 +112,7 @@ static char rcsid[] = "$NetBSD: s_expm1.c,v 1.8 1995/05/10 20:47:09 jtc Exp $"; * to produce the hexadecimal values shown. */ +#include <errno.h> #include "math.h" #include "math_private.h" #define one Q[0] @@ -159,7 +160,10 @@ Q[] = {1.0, -3.33333333333331316428e-02, /* BFA11111 111110F4 */ return x+x; /* NaN */ else return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */ } - if(x > o_threshold) return huge*huge; /* overflow */ + if(x > o_threshold) { + __set_errno (ERANGE); + return huge*huge; /* overflow */ + } } if(xsb!=0) { /* x < -56*ln2, return -1.0 with inexact */ if(x+tiny<0.0) /* raise inexact */ diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c index 86e1a6d121..b40776f5e2 100644 --- a/sysdeps/ieee754/dbl-64/s_sin.c +++ b/sysdeps/ieee754/dbl-64/s_sin.c @@ -1,7 +1,7 @@ /* * IBM Accurate Mathematical Library * written by International Business Machines Corp. - * Copyright (C) 2001 Free Software Foundation + * Copyright (C) 2001, 2009 Free Software Foundation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -48,6 +48,7 @@ /****************************************************************************/ +#include <errno.h> #include "endian.h" #include "mydefs.h" #include "usncs.h" @@ -329,7 +330,11 @@ double __sin(double x){ } /* else if (k < 0x7ff00000 ) */ /*--------------------- |x| > 2^1024 ----------------------------------*/ - else return x / x; + else { + if (k == 0x7ff00000 && u.i[LOW_HALF] == 0) + __set_errno (EDOM); + return x / x; + } return 0; /* unreachable */ } @@ -572,7 +577,11 @@ double __cos(double x) - else return x / x; /* |x| > 2^1024 */ + else { + if (k == 0x7ff00000 && u.i[LOW_HALF] == 0) + __set_errno (EDOM); + return x / x; /* |x| > 2^1024 */ + } return 0; } diff --git a/sysdeps/ieee754/dbl-64/s_tan.c b/sysdeps/ieee754/dbl-64/s_tan.c index cf8d4d0267..4e26d90ae1 100644 --- a/sysdeps/ieee754/dbl-64/s_tan.c +++ b/sysdeps/ieee754/dbl-64/s_tan.c @@ -1,7 +1,7 @@ /* * IBM Accurate Mathematical Library * written by International Business Machines Corp. - * Copyright (C) 2001 Free Software Foundation + * Copyright (C) 2001, 2009 Free Software Foundation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -33,6 +33,8 @@ /* round to nearest mode of IEEE 754 standard. */ /* */ /*********************************************************************/ + +#include <errno.h> #include "endian.h" #include "dla.h" #include "mpa.h" @@ -61,7 +63,11 @@ double tan(double x) { /* x=+-INF, x=NaN */ num.d = x; ux = num.i[HIGH_HALF]; - if ((ux&0x7ff00000)==0x7ff00000) return x-x; + if ((ux&0x7ff00000)==0x7ff00000) { + if ((ux&0x7fffffff)==0x7ff00000) + __set_errno (EDOM); + return x-x; + } w=(x<ZERO) ? -x : x; @@ -108,7 +114,8 @@ double tan(double x) { fi = xfg[i][1].d; gi = xfg[i][2].d; t2 = pz*(gi+fi)/(gi-pz); if ((y=fi+(t2-fi*u3.d))==fi+(t2+fi*u3.d)) return (s*y); t3 = (t2<ZERO) ? -t2 : t2; - if ((y=fi+(t2-(t4=fi*ua3.d+t3*ub3.d)))==fi+(t2+t4)) return (s*y); + t4 = fi*ua3.d+t3*ub3.d; + if ((y=fi+(t2-t4))==fi+(t2+t4)) return (s*y); /* Second stage */ ffi = xfg[i][3].d; @@ -216,13 +223,15 @@ double tan(double x) { t2 = pz*(fi+gi)/(fi+pz); if ((y=gi-(t2-gi*u10.d))==gi-(t2+gi*u10.d)) return (-sy*y); t3 = (t2<ZERO) ? -t2 : t2; - if ((y=gi-(t2-(t4=gi*ua10.d+t3*ub10.d)))==gi-(t2+t4)) return (-sy*y); } + t4 = gi*ua10.d+t3*ub10.d; + if ((y=gi-(t2-t4))==gi-(t2+t4)) return (-sy*y); } else { /* tan */ t2 = pz*(gi+fi)/(gi-pz); if ((y=fi+(t2-fi*u9.d))==fi+(t2+fi*u9.d)) return (sy*y); t3 = (t2<ZERO) ? -t2 : t2; - if ((y=fi+(t2-(t4=fi*ua9.d+t3*ub9.d)))==fi+(t2+t4)) return (sy*y); } + t4 = fi*ua9.d+t3*ub9.d; + if ((y=fi+(t2-t4))==fi+(t2+t4)) return (sy*y); } /* Second stage */ ffi = xfg[i][3].d; @@ -327,13 +336,15 @@ double tan(double x) { t2 = pz*(fi+gi)/(fi+pz); if ((y=gi-(t2-gi*u18.d))==gi-(t2+gi*u18.d)) return (-sy*y); t3 = (t2<ZERO) ? -t2 : t2; - if ((y=gi-(t2-(t4=gi*ua18.d+t3*ub18.d)))==gi-(t2+t4)) return (-sy*y); } + t4 = gi*ua18.d+t3*ub18.d; + if ((y=gi-(t2-t4))==gi-(t2+t4)) return (-sy*y); } else { /* tan */ t2 = pz*(gi+fi)/(gi-pz); if ((y=fi+(t2-fi*u17.d))==fi+(t2+fi*u17.d)) return (sy*y); t3 = (t2<ZERO) ? -t2 : t2; - if ((y=fi+(t2-(t4=fi*ua17.d+t3*ub17.d)))==fi+(t2+t4)) return (sy*y); } + t4 = fi*ua17.d+t3*ub17.d; + if ((y=fi+(t2-t4))==fi+(t2+t4)) return (sy*y); } /* Second stage */ ffi = xfg[i][3].d; @@ -431,13 +442,15 @@ double tan(double x) { t2 = pz*(fi+gi)/(fi+pz); if ((y=gi-(t2-gi*u26.d))==gi-(t2+gi*u26.d)) return (-sy*y); t3 = (t2<ZERO) ? -t2 : t2; - if ((y=gi-(t2-(t4=gi*ua26.d+t3*ub26.d)))==gi-(t2+t4)) return (-sy*y); } + t4 = gi*ua26.d+t3*ub26.d; + if ((y=gi-(t2-t4))==gi-(t2+t4)) return (-sy*y); } else { /* tan */ t2 = pz*(gi+fi)/(gi-pz); if ((y=fi+(t2-fi*u25.d))==fi+(t2+fi*u25.d)) return (sy*y); t3 = (t2<ZERO) ? -t2 : t2; - if ((y=fi+(t2-(t4=fi*ua25.d+t3*ub25.d)))==fi+(t2+t4)) return (sy*y); } + t4 = fi*ua25.d+t3*ub25.d; + if ((y=fi+(t2-t4))==fi+(t2+t4)) return (sy*y); } /* Second stage */ ffi = xfg[i][3].d; diff --git a/sysdeps/ieee754/flt-32/s_cosf.c b/sysdeps/ieee754/flt-32/s_cosf.c index 86c59d440c..4f9f239f6f 100644 --- a/sysdeps/ieee754/flt-32/s_cosf.c +++ b/sysdeps/ieee754/flt-32/s_cosf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -17,6 +17,7 @@ static char rcsid[] = "$NetBSD: s_cosf.c,v 1.4 1995/05/10 20:47:03 jtc Exp $"; #endif +#include <errno.h> #include "math.h" #include "math_private.h" @@ -43,7 +44,11 @@ static float one=1.0; if(ix <= 0x3f490fd8) return __kernel_cosf(x,z); /* cos(Inf or NaN) is NaN */ - else if (ix>=0x7f800000) return x-x; + else if (ix>=0x7f800000) { + if (ix == 0x7f800000) + __set_errno (EDOM); + return x-x; + } /* argument reduction needed */ else { diff --git a/sysdeps/ieee754/flt-32/s_expm1f.c b/sysdeps/ieee754/flt-32/s_expm1f.c index 1f032be25f..3f4536b906 100644 --- a/sysdeps/ieee754/flt-32/s_expm1f.c +++ b/sysdeps/ieee754/flt-32/s_expm1f.c @@ -17,6 +17,7 @@ static char rcsid[] = "$NetBSD: s_expm1f.c,v 1.5 1995/05/10 20:47:11 jtc Exp $"; #endif +#include <errno.h> #include "math.h" #include "math_private.h" @@ -63,7 +64,10 @@ Q5 = -2.0109921195e-07; /* 0xb457edbb */ return x+x; /* NaN */ if(hx==0x7f800000) return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */ - if(x > o_threshold) return huge*huge; /* overflow */ + if(x > o_threshold) { + __set_errno (ERANGE); + return huge*huge; /* overflow */ + } } if(xsb!=0) { /* x < -27*ln2, return -1.0 with inexact */ if(x+tiny<(float)0.0) /* raise inexact */ diff --git a/sysdeps/ieee754/flt-32/s_sinf.c b/sysdeps/ieee754/flt-32/s_sinf.c index 76a7c21fcb..673e379f0c 100644 --- a/sysdeps/ieee754/flt-32/s_sinf.c +++ b/sysdeps/ieee754/flt-32/s_sinf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -17,6 +17,7 @@ static char rcsid[] = "$NetBSD: s_sinf.c,v 1.4 1995/05/10 20:48:16 jtc Exp $"; #endif +#include <errno.h> #include "math.h" #include "math_private.h" @@ -37,7 +38,11 @@ static char rcsid[] = "$NetBSD: s_sinf.c,v 1.4 1995/05/10 20:48:16 jtc Exp $"; if(ix <= 0x3f490fd8) return __kernel_sinf(x,z,0); /* sin(Inf or NaN) is NaN */ - else if (ix>=0x7f800000) return x-x; + else if (ix>=0x7f800000) { + if (ix == 0x7f800000) + __set_errno (EDOM); + return x-x; + } /* argument reduction needed */ else { diff --git a/sysdeps/ieee754/flt-32/s_tanf.c b/sysdeps/ieee754/flt-32/s_tanf.c index e8f6016c32..4a852cb1f4 100644 --- a/sysdeps/ieee754/flt-32/s_tanf.c +++ b/sysdeps/ieee754/flt-32/s_tanf.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -17,6 +17,7 @@ static char rcsid[] = "$NetBSD: s_tanf.c,v 1.4 1995/05/10 20:48:20 jtc Exp $"; #endif +#include <errno.h> #include "math.h" #include "math_private.h" @@ -37,7 +38,11 @@ static char rcsid[] = "$NetBSD: s_tanf.c,v 1.4 1995/05/10 20:48:20 jtc Exp $"; if(ix <= 0x3f490fda) return __kernel_tanf(x,z,1); /* tan(Inf or NaN) is NaN */ - else if (ix>=0x7f800000) return x-x; /* NaN */ + else if (ix>=0x7f800000) { + if (ix==0x7f800000) + __set_errno (EDOM); + return x-x; /* NaN */ + } /* argument reduction needed */ else { diff --git a/sysdeps/ieee754/k_standard.c b/sysdeps/ieee754/k_standard.c index d8fa2a4493..ede5157454 100644 --- a/sysdeps/ieee754/k_standard.c +++ b/sysdeps/ieee754/k_standard.c @@ -383,7 +383,7 @@ static double zero = 0.0; /* used as const */ else exc.retval = HUGE_VAL; if (_LIB_VERSION == _POSIX_) - __set_errno (EDOM); + __set_errno (ERANGE); else if (!matherr(&exc)) { if (_LIB_VERSION == _SVID_) { (void) WRITE2("lgamma: SING error\n", 19); @@ -528,7 +528,7 @@ static double zero = 0.0; /* used as const */ else exc.retval = -HUGE_VAL; if (_LIB_VERSION == _POSIX_) - __set_errno (EDOM); + __set_errno (ERANGE); else if (!matherr(&exc)) { if (_LIB_VERSION == _SVID_) { (void) WRITE2("pow(0,neg): DOMAIN error\n", 25); @@ -547,7 +547,7 @@ static double zero = 0.0; /* used as const */ else exc.retval = HUGE_VAL; if (_LIB_VERSION == _POSIX_) - __set_errno (EDOM); + __set_errno (ERANGE); else if (!matherr(&exc)) { if (_LIB_VERSION == _SVID_) { (void) WRITE2("pow(0,neg): DOMAIN error\n", 25); @@ -692,7 +692,7 @@ static double zero = 0.0; /* used as const */ ? "atanhf" : "atanhl"); exc.retval = x/zero; /* sign(x)*inf */ if (_LIB_VERSION == _POSIX_) - __set_errno (EDOM); + __set_errno (ERANGE); else if (!matherr(&exc)) { if (_LIB_VERSION == _SVID_) { (void) WRITE2("atanh: SING error\n", 18); @@ -990,7 +990,7 @@ static double zero = 0.0; /* used as const */ __set_errno (ERANGE); } break; - + /* #### Last used is 50/150/250 ### */ } return exc.retval; diff --git a/sysdeps/ieee754/ldbl-96/s_cosl.c b/sysdeps/ieee754/ldbl-96/s_cosl.c index 9765f7fd4e..e33abc9afd 100644 --- a/sysdeps/ieee754/ldbl-96/s_cosl.c +++ b/sysdeps/ieee754/ldbl-96/s_cosl.c @@ -49,6 +49,7 @@ static char rcsid[] = "$NetBSD: $"; * TRIG(x) returns trig(x) nearly rounded */ +#include <errno.h> #include "math.h" #include "math_private.h" @@ -71,7 +72,11 @@ static char rcsid[] = "$NetBSD: $"; return __kernel_cosl(x,z); /* cos(Inf or NaN) is NaN */ - else if (se==0x7fff) return x-x; + else if (se==0x7fff) { + if ((i0 | i1) == 0) + __set_errno (EDOM); + return x-x; + } /* argument reduction needed */ else { diff --git a/sysdeps/ieee754/ldbl-96/s_sinl.c b/sysdeps/ieee754/ldbl-96/s_sinl.c index 4fd48805b4..b939bd6a99 100644 --- a/sysdeps/ieee754/ldbl-96/s_sinl.c +++ b/sysdeps/ieee754/ldbl-96/s_sinl.c @@ -49,6 +49,7 @@ static char rcsid[] = "$NetBSD: $"; * TRIG(x) returns trig(x) nearly rounded */ +#include <errno.h> #include "math.h" #include "math_private.h" @@ -71,7 +72,11 @@ static char rcsid[] = "$NetBSD: $"; return __kernel_sinl(x,z,0); /* sin(Inf or NaN) is NaN */ - else if (se==0x7fff) return x-x; + else if (se==0x7fff) { + if ((i0 | i1) == 0) + __set_errno (EDOM); + return x-x; + } /* argument reduction needed */ else { |