www.pudn.com > 文件恢复及修补 C 语言源程序.zip > ATAN.C


 
/*********************************************************** 
 *               The TULSA IBM C BOARD                     * 
 *                   918-664-8737                          * 
 *             300/1200 XMODEM, 24 Hours                   * 
 **********************************************************/ 
 
 
#include "libc.h" 
#include "math.h" 
#include "errno.h" 
 
static int nopper() {;} 
 
#define PI              3.14159265358979323846 
#define PIov2   1.57079632679489661923 
 
double atan2(v,u) 
double u,v; 
{ 
        double f; 
        int (*save)(); 
        extern int flterr; 
        extern int errno; 
 
        if (u == 0.0) { 
                if (v == 0.0) { 
                        errno = EDOM; 
                        return 0.0; 
                } 
                return PIov2; 
        } 
 
        save = Sysvec[FLT_FAULT]; 
        Sysvec[FLT_FAULT] = nopper; 
        flterr = 0; 
        f = v/u; 
        Sysvec[FLT_FAULT] = save; 
        if (flterr == 2)        /* overflow */ 
                f = PIov2; 
        else { 
                if (flterr == 1)        /* underflow */ 
                        f = 0.0; 
                else 
                        f = atan(fabs(f)); 
                if (u < 0.0) 
                        f = PI - f; 
        } 
        if (v < 0.0) 
                f = -f; 
        return f; 
} 
 
#define P0 -0.13688768894191926929e+2 
#define P1 -0.20505855195861651981e+2 
#define P2 -0.84946240351320683534e+1 
#define P3 -0.83758299368150059274e+0 
#define Q0 +0.41066306682575781263e+2 
#define Q1 +0.86157349597130242515e+2 
#define Q2 +0.59578436142597344465e+2 
#define Q3 +0.15024001160028576121e+2 
 
#define P(g) (((P3*g P2)*g P1)*g P0) 
#define Q(g) ((((g Q3)*g Q2)*g Q1)*g Q0) 
 
double atan(x) 
double x; 
{ 
        double f, r, g; 
        int n; 
        static double Avals[4] = { 
                0.0, 
                0.52359877559829887308, 
                1.57079632679489661923, 
                1.04719755119659774615 
        }; 
 
        n = 0; 
        f = fabs(x); 
        if (f > 1.0) { 
                f = 1.0/f; 
                n = 2; 
        } 
        if (f > 0.26794919243112270647) { 
                f = (((0.73205080756887729353*f - 0.5) - 0.5) + f) / 
                                (1.73205080756887729353 + f); 
                ++n; 
        } 
        if (fabs(f) < 2.3e-10) 
                r = f; 
        else { 
                g = f*f; 
                r = f + f * 
                        ((P(g)*g) 
                        /Q(g)); 
        } 
        if (n > 1) 
                r = -r; 
        r += Avals[n]; 
        if (x < 0.0) 
                r = -r; 
        return r; 
}