SDL
2.0
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
)
math_private.h
z
GLdouble GLdouble z
Definition:
SDL_opengl_glext.h:407
n
GLdouble n
Definition:
SDL_opengl_glext.h:1955
libm_hidden_def
libm_hidden_def(scalbln)
Definition:
s_scalbn.c:66
math_libm.h
__ieee754_rem_pio2
int32_t attribute_hidden __ieee754_rem_pio2(double x, double *y)
Definition:
e_rem_pio2.c:69
x
GLint GLint GLint GLint GLint x
Definition:
SDL_opengl.h:1574
int32_t
signed int int32_t
Definition:
SDL_config_windows.h:62
tan
double tan(double x)
Definition:
s_tan.c:45
__kernel_tan
double attribute_hidden __kernel_tan(double x, double y, int iy)
Definition:
k_tan.c:69
y
GLint GLint GLint GLint GLint GLint y
Definition:
SDL_opengl.h:1574
GET_HIGH_WORD
#define GET_HIGH_WORD(i, d)
Definition:
math_private.h:109
src
libm
s_tan.c
Generated by
1.8.18