Annotation of 43BSD/usr.lib/libom/tan.c, revision 1.1.1.1

1.1       root        1: /*     @(#)tan.c       4.1     12/25/82        */
                      2: 
                      3: /*
                      4:        floating point tangent
                      5: 
                      6:        A series is used after range reduction.
                      7:        Coefficients are #4285 from Hart & Cheney. (19.74D)
                      8: */
                      9: 
                     10: #include <errno.h>
                     11: #include <math.h>
                     12: 
                     13: int    errno;
                     14: static double invpi      = 1.27323954473516268;
                     15: static double p0        = -0.1306820264754825668269611177e+5;
                     16: static double p1         = 0.1055970901714953193602353981e+4;
                     17: static double p2        = -0.1550685653483266376941705728e+2;
                     18: static double p3         = 0.3422554387241003435328470489e-1;
                     19: static double p4         = 0.3386638642677172096076369e-4;
                     20: static double q0        = -0.1663895238947119001851464661e+5;
                     21: static double q1         = 0.4765751362916483698926655581e+4;
                     22: static double q2        = -0.1555033164031709966900124574e+3;
                     23: 
                     24: double
                     25: tan(arg)
                     26: double arg;
                     27: {
                     28:        double modf();
                     29:        double sign, temp, e, x, xsq;
                     30:        int flag, i;
                     31: 
                     32:        flag = 0;
                     33:        sign = 1.;
                     34:        if(arg < 0.){
                     35:                arg = -arg;
                     36:                sign = -1.;
                     37:        }
                     38:        arg = arg*invpi;   /*overflow?*/
                     39:        x = modf(arg,&e);
                     40:        i = e;
                     41:        switch(i%4) {
                     42:        case 1:
                     43:                x = 1. - x;
                     44:                flag = 1;
                     45:                break;
                     46: 
                     47:        case 2:
                     48:                sign = - sign;
                     49:                flag = 1;
                     50:                break;
                     51: 
                     52:        case 3:
                     53:                x = 1. - x;
                     54:                sign = - sign;
                     55:                break;
                     56: 
                     57:        case 0:
                     58:                break;
                     59:        }
                     60: 
                     61:        xsq = x*x;
                     62:        temp = ((((p4*xsq+p3)*xsq+p2)*xsq+p1)*xsq+p0)*x;
                     63:        temp = temp/(((1.0*xsq+q2)*xsq+q1)*xsq+q0);
                     64: 
                     65:        if(flag == 1) {
                     66:                if(temp == 0.) {
                     67:                        errno = ERANGE;
                     68:                        if (sign>0)
                     69:                                return(HUGE);
                     70:                        return(-HUGE);
                     71:                }
                     72:                temp = 1./temp;
                     73:        }
                     74:        return(sign*temp);
                     75: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.