SDL
2.0
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
s_tan.c
Go to the documentation of this file.
1
/*
2
* ====================================================
3
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4
*
5
* Developed at SunPro, a Sun Microsystems, Inc. business.
6
* Permission to use, copy, modify, and distribute this
7
* software is freely granted, provided that this notice
8
* is preserved.
9
* ====================================================
10
*/
11
12
/* tan(x)
13
* Return tangent function of x.
14
*
15
* kernel function:
16
* __kernel_tan ... tangent function on [-pi/4,pi/4]
17
* __ieee754_rem_pio2 ... argument reduction routine
18
*
19
* Method.
20
* Let S,C and T denote the sin, cos and tan respectively on
21
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
22
* in [-pi/4 , +pi/4], and let n = k mod 4.
23
* We have
24
*
25
* n sin(x) cos(x) tan(x)
26
* ----------------------------------------------------------
27
* 0 S C T
28
* 1 C -S -1/T
29
* 2 -S -C T
30
* 3 -C S -1/T
31
* ----------------------------------------------------------
32
*
33
* Special cases:
34
* Let trig be any of sin, cos, or tan.
35
* trig(+-INF) is NaN, with signals;
36
* trig(NaN) is that NaN;
37
*
38
* Accuracy:
39
* TRIG(x) returns trig(x) nearly rounded
40
*/
41
42
#include "
math_libm.h
"
43
#include "
math_private.h
"
44
45
double
tan
(
double
x
)
46
{
47
double
y
[2],
z
=0.0;
48
int32_t
n
, ix;
49
50
/* High word of x. */
51
GET_HIGH_WORD
(ix,x);
52
53
/* |x| ~< pi/4 */
54
ix &= 0x7fffffff;
55
if
(ix <= 0x3fe921fb)
return
__kernel_tan
(x,z,1);
56
57
/* tan(Inf or NaN) is NaN */
58
else
if
(ix>=0x7ff00000)
return
x-
x
;
/* NaN */
59
60
/* argument reduction needed */
61
else
{
62
n =
__ieee754_rem_pio2
(x,y);
63
return
__kernel_tan
(y[0],y[1],1-((n&1)<<1));
/* 1 -- n even
64
-1 -- n odd */
65
}
66
}
67
libm_hidden_def
(
tan
)
src
libm
s_tan.c
Generated on Sun Jun 26 2022 23:07:12 for SDL by
1.8.1.2