Annotation of 43BSDTahoe/cci/libM/atand.c, revision 1.1.1.1

1.1       root        1: /*     @(#)atan.c      4.1/4.2         10/31/84  CCI-CPG       */
                      2: 
                      3: 
                      4: /*
                      5:  * Double-precision arctangent function recoded with
                      6:  * new algorithm polynomial at CCI-CPG.
                      7:  * 
                      8:  * atan returns the value of the arctangent of its
                      9:  * argument in the range [-pi/2,pi/2].
                     10:  * 
                     11:  * atan2 returns the arctangent of arg1/arg2
                     12:  * in the range [-pi,pi].
                     13:  * 
                     14:  * There are no error returns.
                     15:  * 
                     16:  * New version by Les Powers (3/31/85)
                     17:  */
                     18: 
                     19: #include "atand.h"
                     20: 
                     21: 
                     22: static double pio2 =  1.570796326794896619231e0;
                     23: static double pio4 =  0.785398163397448309615e0;
                     24: static double ap0  =  1.0;
                     25: static double ap1  = -1.0/3.0;
                     26: static double ap2  =  1.0/5.0;
                     27: static double ap3  = -1.0/7.0;
                     28: 
                     29: 
                     30: /*
                     31:  * atan reduces its argument
                     32:  * and returns the arctan.
                     33:  */
                     34: double
                     35: atan(x)
                     36: double x;
                     37: {
                     38:        double t,s;
                     39:        unsigned ta;
                     40:        union {
                     41:          double d;
                     42:          struct { unsigned i0,i1; } i;
                     43:          struct { unsigned char b0,b1,b2,b3; } b;
                     44:        } u;
                     45:        if ( x < 0 )
                     46:          return( -atan(-x) );
                     47:        u.d = x;
                     48:        if (u.i.i0 >= 0x41000000 ) {            /* if (x >= 2.0) */
                     49:          return( pio2 - atan( 1.0/x ) );
                     50:        }
                     51:        if (u.i.i0 >= 0x40000000 ) {            /* if (x >= 0.5) */
                     52:          u.i.i0 = (u.i.i0 & 0x40ff8000) | 0x00008000;
                     53:          u.i.i1 = 0;
                     54:          t = (x-u.d)/(x*u.d+1.0);
                     55:          s = t*t;
                     56:          return( t*(ap0+s*(ap1+s*ap2)) + at1[u.b.b1] );
                     57:        }
                     58:        if (u.i.i0 >= 0x3d000000) {             /* if (x >= 1/128) */
                     59:          u.i.i0 += 0x03800000;
                     60:          ta = u.d;
                     61:          u.d = ta;
                     62:          u.i.i0 -= 0x03800000;
                     63:          t = (x-u.d)/(x*u.d+1.0);
                     64:        }
                     65:        else {
                     66:          ta = 0;
                     67:          t = x;
                     68:        }
                     69:        s = t*t;
                     70:        return( t*(ap0+s*(ap1+s*(ap2+s*ap3))) + at0[ta] );
                     71: }
                     72: 
                     73: 
                     74: /*
                     75:  * atan2 discovers what quadrant the angle
                     76:  * is in and calls atan.
                     77:  */
                     78: double
                     79: atan2(y,x)
                     80: double y,x;
                     81: {
                     82:        double atan();
                     83: 
                     84:        if (y > 0)
                     85:          if ( x >= y )
                     86:                return(        atan(y/x));
                     87:          else if ( x >= 0 )
                     88:                return( pio2 - atan(x/y));
                     89:          else if (-x <= y )
                     90:                return( pio2 + atan(-x/y));
                     91:          else
                     92:                return( pio2 + pio2 - atan(-y/x));
                     93:        else if (y < 0)
                     94:          if ( x >= -y )
                     95:                return(       -atan(-y/x));
                     96:          else if ( x >= 0 )
                     97:                return(-pio2 + atan(x/(-y)));
                     98:          else if (-x <= -y )
                     99:                return(-pio2 - atan(x/y));
                    100:          else
                    101:                return(-pio2 - pio2 + atan(y/x));
                    102:        else
                    103:          if ( x > 0 )
                    104:                return( 0 );
                    105:          else if ( x < 0 )
                    106:                return( pio2 + pio2 );
                    107:          else
                    108:                return( pio2 );
                    109: }

unix.superglobalmegacorp.com

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