Path: utzoo!censor!geac!torsqnt!news-server.csri.toronto.edu!cs.utexas.edu!sun-barr!lll-winken!uunet!mcsun!unido!rwthinf!cip-s01.informatik.rwth-aachen.de!u31b3hs From: u31b3hs@cip-s01.informatik.rwth-aachen.de (Michael Haardt) Newsgroups: comp.os.minix Subject: A atan function Message-ID: <3893@rwthinf.UUCP> Date: 28 Jan 91 09:43:49 GMT Sender: news@rwthinf.UUCP Reply-To: u31b3hs@cip-s01.informatik.rwth-aachen.de (Michael Haardt) Organization: Informatik RWTH Aachen Lines: 80 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 #include #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=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)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 --------------------------------