1 // Copyright 2010 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
7 // Coefficients _sin[] and _cos[] are found in pkg/math/sin.go.
9 // Sincos returns Sin(x), Cos(x).
13 // Sincos(±Inf) = NaN, NaN
14 // Sincos(NaN) = NaN, NaN
15 func Sincos(x
float64) (sin
, cos
float64) {
19 func sincos(x
float64) (sin
, cos
float64) {
21 PI4A
= 7.85398125648498535156E-1 // 0x3fe921fb40000000, Pi/4 split into three parts
22 PI4B
= 3.77489470793079817668E-8 // 0x3e64442d00000000,
23 PI4C
= 2.69515142907905952645E-15 // 0x3ce8469898cc5170,
24 M4PI
= 1.273239544735162542821171882678754627704620361328125 // 4/pi
29 return x
, 1 // return ±0.0, 1.0
30 case IsNaN(x
) ||
IsInf(x
, 0):
34 // make argument positive
35 sinSign
, cosSign
:= false, false
41 j
:= int64(x
* M4PI
) // integer part of x/(Pi/4), as integer for tests on the phase angle
42 y
:= float64(j
) // integer part of x/(Pi/4), as float
44 if j
&1 == 1 { // map zeros to origin
48 j
&= 7 // octant modulo 2Pi radians (360 degrees)
49 if j
> 3 { // reflect in x axis
51 sinSign
, cosSign
= !sinSign
, !cosSign
57 z
:= ((x
- y
*PI4A
) - y
*PI4B
) - y
*PI4C
// Extended precision modular arithmetic
59 cos
= 1.0 - 0.5*zz
+ zz
*zz
*((((((_cos
[0]*zz
)+_cos
[1])*zz
+_cos
[2])*zz
+_cos
[3])*zz
+_cos
[4])*zz
+_cos
[5])
60 sin
= z
+ z
*zz
*((((((_sin
[0]*zz
)+_sin
[1])*zz
+_sin
[2])*zz
+_sin
[3])*zz
+_sin
[4])*zz
+_sin
[5])