// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package math /* * 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) */ const ( p4 = .161536412982230228262e2; p3 = .26842548195503973794141e3; p2 = .11530293515404850115428136e4; p1 = .178040631643319697105464587e4; p0 = .89678597403663861959987488e3; q4 = .5895697050844462222791e2; q3 = .536265374031215315104235e3; q2 = .16667838148816337184521798e4; q1 = .207933497444540981287275926e4; q0 = .89678597403663861962481162e3; pio2 = .15707963267948966192313216e1; pio4 = .7853981633974483096156608e0; sq2p1 = .2414213562373095048802e1; // sqrt(2)+1 sq2m1 = .414213562373095048802e0; // sqrt(2)-1 ) /* * xatan evaluates a series valid in the * range [-0.414...,+0.414...]. (tan(pi/8)) */ func Xatan(arg float64) float64 { 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; } /* * satan reduces its argument (known to be positive) * to the range [0,0.414...] and calls xatan. */ func Satan(arg float64) float64 { if arg < sq2m1 { return Xatan(arg); } if arg > sq2p1 { return pio2 - Xatan(1/arg); } return pio4 + Xatan((arg-1)/(arg+1)); } /* * atan makes its argument positive and * calls the inner routine satan. */ export func Atan(arg float64) float64 { if arg > 0 { return Satan(arg); } return -Satan(-arg); }