Annotation of 43BSDReno/old/libm/libom/tan.c, revision 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.