// 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

import "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)
 */

/*
 *	xatan evaluates a series valid in the
 *	range [-0.414...,+0.414...]. (tan(pi/8))
 */
func xatan(arg float64) float64 {
	const
	(
		P4	= .161536412982230228262e2;
		P3	= .26842548195503973794141e3;
		P2	= .11530293515404850115428136e4;
		P1	= .178040631643319697105464587e4;
		P0	= .89678597403663861959987488e3;
		Q4	= .5895697050844462222791e2;
		Q3	= .536265374031215315104235e3;
		Q2	= .16667838148816337184521798e4;
		Q1	= .207933497444540981287275926e4;
		Q0	= .89678597403663861962481162e3;
	)
	sq := arg*arg;
	value := ((((P4*sq + P3)*sq + P2)*sq + P1)*sq + P0);
	value = value/(((((sq + Q4)*sq + Q3)*sq + Q2)*sq + Q1)*sq + 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 < Sqrt2 - 1 {
		return xatan(arg);
	}
	if arg > Sqrt2 + 1 {
		return Pi/2 - xatan(1/arg);
	}
	return Pi/4 + xatan((arg-1)/(arg+1));
}

/*
 *	atan makes its argument positive and
 *	calls the inner routine satan.
 */

// Atan returns the arc tangent of x.
func Atan(x float64) float64 {
	if x > 0 {
		return satan(x);
	}
	return -satan(-x);
}
