u31b3hs@cip-s01.informatik.rwth-aachen.de (Michael Haardt) (01/28/91)
From: u31b3hs%cip-s01.informatik.rwth-aachen.de@unido.de Hello world! A few weeks ago, someone asked for a arctan function. Here it is. I use this function since the good old CP/M days, therefore I don't know its origin. It works with PC MINIX 1.5.10 floating point library, for higher precision you should change some definitions. I am still waiting for a complete libm.a, perhaps other people find other functions in their sources. Post them, if they are missing in MINIX! Note to AST: I heard that there will be official floating point support for 1.6. What about libm.a, is it complete or should we work to finish it? -------- snip, snip, snip --------- not the listing!!!! ... oh boy ---------- #include <lib.h> #include <math.h> #define eps 1.49011611938477e-8 #define Smallest 1.0e-7 #define Biggest 1.0e15 #define MaxArctan 1.5707963267948966192 #define SqrtThree 1.7320508075688772935 #define SqrtThreeLessOne 0.7320508075688772935 #define TwoLessSqrtThree 0.26794919243112270647 #define ArcTanP0 -13.6887688941919 #define ArcTanP1 -20.5058551958617 #define ArcTanP2 -8.49462403513207 #define ArcTanP3 -0.837582993681501 #define ArcTanQ0 41.0663066825758 #define ArcTanQ1 86.1573495971302 #define ArcTanQ2 59.5784361425973 #define ArcTanQ3 15.0240011600286 static double ArctanA[4] = { 0.0, 0.523598775598299, 1.5707963267948966192, 1.04719755119660 }; double atan(x) double x; { double f,g,R,P,Q,Result; unsigned int n; f=fabs(x); if (f<Smallest) return x; /* Underflow! */ else if (x>=Biggest) return MaxArctan; /* Overflow! */ else if (x<=-Biggest) return -MaxArctan; /* Overflow! */ if (f>1.0) { f=1.0/f; n=2; } else n=0; if (f>TwoLessSqrtThree) { f=(((SqrtThreeLessOne*f-0.5)-0.5)+f)/(SqrtThree+f); n++; /* ignore scale f step for floating-point implementation */ } if (fabs(f)<eps) Result=f; else { g=f*f; /* evaluate R(g) */ P=((ArcTanP3*g+ArcTanP2)*g+ArcTanP1)*g+ArcTanP0; Q=(((g+ArcTanQ3)*g+ArcTanQ2)*g+ArcTanQ1)*g+ArcTanQ0; R=g*P/Q; Result=f+f*R; } if (n>1) Result = -Result; Result=ArctanA[n]+Result; if (x<0.0) Result = -Result; return Result; } ----------------------------- snip, snip again ---------------------------- Michael Haardt u31b3hs%cip-s01.informatik.rwth-aachen.de@unido.bitnet --------------------------------- Namaskaar --------------------------------