]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libgo/go/math/atan.go
libgo: Update to current sources.
[thirdparty/gcc.git] / libgo / go / math / atan.go
index b739721e81c1093e5d1f767780a149bc5ff529a2..986ba06866142007480d9c44d7e1fc7e1cad1d67 100644 (file)
@@ -6,44 +6,85 @@ 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)
 */
 
-// xatan evaluates a series valid in the
-// range [-0.414...,+0.414...]. (tan(pi/8))
-func xatan(arg float64) float64 {
+// The original C code, the long comment, and the constants below were
+// from http://netlib.sandia.gov/cephes/cmath/atan.c, available from
+// http://www.netlib.org/cephes/cmath.tgz.
+// The go code is a version of the original C.
+//
+// atan.c
+// Inverse circular tangent (arctangent)
+//
+// SYNOPSIS:
+// double x, y, atan();
+// y = atan( x );
+//
+// DESCRIPTION:
+// Returns radian angle between -pi/2 and +pi/2 whose tangent is x.
+//
+// Range reduction is from three intervals into the interval from zero to 0.66.
+// The approximant uses a rational function of degree 4/5 of the form
+// x + x**3 P(x)/Q(x).
+//
+// ACCURACY:
+//                      Relative error:
+// arithmetic   domain    # trials  peak     rms
+//    DEC       -10, 10   50000     2.4e-17  8.3e-18
+//    IEEE      -10, 10   10^6      1.8e-16  5.0e-17
+//
+// Cephes Math Library Release 2.8:  June, 2000
+// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
+//
+// The readme file at http://netlib.sandia.gov/cephes/ says:
+//    Some software in this archive may be from the book _Methods and
+// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
+// International, 1989) or from the Cephes Mathematical Library, a
+// commercial product. In either event, it is copyrighted by the author.
+// What you see here may be used freely but it comes with no support or
+// guarantee.
+//
+//   The two known misprints in the book are repaired here in the
+// source listings for the gamma function and the incomplete beta
+// integral.
+//
+//   Stephen L. Moshier
+//   moshier@na-net.ornl.gov
+
+// xatan evaluates a series valid in the range [0, 0.66].
+func xatan(x float64) float64 {
        const (
-               P4 = .161536412982230228262e2
-               P3 = .26842548195503973794141e3
-               P2 = .11530293515404850115428136e4
-               P1 = .178040631643319697105464587e4
-               P0 = .89678597403663861959987488e3
-               Q4 = .5895697050844462222791e2
-               Q3 = .536265374031215315104235e3
-               Q2 = .16667838148816337184521798e4
-               Q1 = .207933497444540981287275926e4
-               Q0 = .89678597403663861962481162e3
+               P0 = -8.750608600031904122785e-01
+               P1 = -1.615753718733365076637e+01
+               P2 = -7.500855792314704667340e+01
+               P3 = -1.228866684490136173410e+02
+               P4 = -6.485021904942025371773e+01
+               Q0 = +2.485846490142306297962e+01
+               Q1 = +1.650270098316988542046e+02
+               Q2 = +4.328810604912902668951e+02
+               Q3 = +4.853903996359136964868e+02
+               Q4 = +1.945506571482613964425e+02
        )
-       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
+       z := x * x
+       z = z * ((((P0*z+P1)*z+P2)*z+P3)*z + P4) / (((((z+Q0)*z+Q1)*z+Q2)*z+Q3)*z + Q4)
+       z = x*z + x
+       return z
 }
 
 // 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)
+// to the range [0, 0.66] and calls xatan.
+func satan(x float64) float64 {
+       const (
+               Morebits = 6.123233995736765886130e-17 // pi/2 = PIO2 + Morebits
+               Tan3pio8 = 2.41421356237309504880      // tan(3*pi/8)
+       )
+       if x <= 0.66 {
+               return xatan(x)
        }
-       if arg > Sqrt2+1 {
-               return Pi/2 - xatan(1/arg)
+       if x > Tan3pio8 {
+               return Pi/2 - xatan(1/x) + Morebits
        }
-       return Pi/4 + xatan((arg-1)/(arg+1))
+       return Pi/4 + xatan((x-1)/(x+1)) + 0.5*Morebits
 }
 
 // Atan returns the arctangent of x.