123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /*
- * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
- *
- * This product is part of the Amsterdam Compiler Kit.
- *
- * Permission to use, sell, duplicate or disclose this software must be
- * obtained in writing. Requests for such permissions may be sent to
- *
- * Dr. Andrew S. Tanenbaum
- * Wiskundig Seminarium
- * Vrije Universiteit
- * Postbox 7161
- * 1007 MC Amsterdam
- * The Netherlands
- *
- */
- /* $Header$ */
- /* Author: J.W. Stevenson */
- /*
- floating-point arctangent
- atan returns the value of the arctangent of its
- argument in the range [-pi/2,pi/2].
- there are no error returns.
- coefficients are #5077 from Hart & Cheney. (19.56D)
- */
- static double sq2p1 = 2.414213562373095048802e0;
- static double sq2m1 = .414213562373095048802e0;
- static double pio2 = 1.570796326794896619231e0;
- static double pio4 = .785398163397448309615e0;
- static double p4 = .161536412982230228262e2;
- static double p3 = .26842548195503973794141e3;
- static double p2 = .11530293515404850115428136e4;
- static double p1 = .178040631643319697105464587e4;
- static double p0 = .89678597403663861959987488e3;
- static double q4 = .5895697050844462222791e2;
- static double q3 = .536265374031215315104235e3;
- static double q2 = .16667838148816337184521798e4;
- static double q1 = .207933497444540981287275926e4;
- static double q0 = .89678597403663861962481162e3;
- /*
- xatan evaluates a series valid in the
- range [-0.414...,+0.414...].
- */
- static double
- xatan(arg)
- double arg;
- {
- double argsq;
- double value;
- argsq = arg*arg;
- value = ((((p4*argsq + p3)*argsq + p2)*argsq + p1)*argsq + p0);
- value = value/(((((argsq + q4)*argsq + q3)*argsq + q2)*argsq + q1)*argsq + q0);
- return(value*arg);
- }
- static double
- satan(arg)
- double arg;
- {
- if(arg < sq2m1)
- return(xatan(arg));
- else if(arg > sq2p1)
- return(pio2 - xatan(1/arg));
- else
- return(pio4 + xatan((arg-1)/(arg+1)));
- }
- /*
- atan makes its argument positive and
- calls the inner routine satan.
- */
- double
- _atn(arg)
- double arg;
- {
- if(arg>0)
- return(satan(arg));
- else
- return(-satan(-arg));
- }
|