SDL
2.0
s_sin.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
/* sin(x)
13
* Return sine function of x.
14
*
15
* kernel function:
16
* __kernel_sin ... sine function on [-pi/4,pi/4]
17
* __kernel_cos ... cose function on [-pi/4,pi/4]
18
* __ieee754_rem_pio2 ... argument reduction routine
19
*
20
* Method.
21
* Let S,C and T denote the sin, cos and tan respectively on
22
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
23
* in [-pi/4 , +pi/4], and let n = k mod 4.
24
* We have
25
*
26
* n sin(x) cos(x) tan(x)
27
* ----------------------------------------------------------
28
* 0 S C T
29
* 1 C -S -1/T
30
* 2 -S -C T
31
* 3 -C S -1/T
32
* ----------------------------------------------------------
33
*
34
* Special cases:
35
* Let trig be any of sin, cos, or tan.
36
* trig(+-INF) is NaN, with signals;
37
* trig(NaN) is that NaN;
38
*
39
* Accuracy:
40
* TRIG(x) returns trig(x) nearly rounded
41
*/
42
43
#include "
math_libm.h
"
44
#include "
math_private.h
"
45
46
double
sin
(
double
x
)
47
{
48
double
y
[2],
z
=0.0;
49
int32_t
n
, ix;
50
51
/* High word of x. */
52
GET_HIGH_WORD
(ix,
x
);
53
54
/* |x| ~< pi/4 */
55
ix &= 0x7fffffff;
56
if
(ix <= 0x3fe921fb)
return
__kernel_sin
(
x
,
z
,0);
57
58
/* sin(Inf or NaN) is NaN */
59
else
if
(ix>=0x7ff00000)
return
x
-
x
;
60
61
/* argument reduction needed */
62
else
{
63
n
=
__ieee754_rem_pio2
(
x
,
y
);
64
switch
(
n
&3) {
65
case
0:
return
__kernel_sin
(
y
[0],
y
[1],1);
66
case
1:
return
__kernel_cos
(
y
[0],
y
[1]);
67
case
2:
return
-
__kernel_sin
(
y
[0],
y
[1],1);
68
default
:
69
return
-
__kernel_cos
(
y
[0],
y
[1]);
70
}
71
}
72
}
73
libm_hidden_def
(
sin
)
math_private.h
__kernel_sin
double attribute_hidden __kernel_sin(double x, double y, int iy)
Definition:
k_sin.c:52
z
GLdouble GLdouble z
Definition:
SDL_opengl_glext.h:404
n
GLdouble n
Definition:
SDL_opengl_glext.h:1952
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
y
GLint GLint GLint GLint GLint GLint y
Definition:
SDL_opengl.h:1574
__kernel_cos
double attribute_hidden __kernel_cos(double x, double y)
Definition:
k_cos.c:59
GET_HIGH_WORD
#define GET_HIGH_WORD(i, d)
Definition:
math_private.h:109
sin
double sin(double x)
Definition:
s_sin.c:46
src
libm
s_sin.c
Generated by
1.8.17