Numworks Epsilon
1.4.1
Graphing Calculator Operating System
s_tan.c
Go to the documentation of this file.
1
/* @(#)s_tan.c 5.1 93/09/24 */
2
/*
3
* ====================================================
4
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5
*
6
* Developed at SunPro, a Sun Microsystems, Inc. business.
7
* Permission to use, copy, modify, and distribute this
8
* software is freely granted, provided that this notice
9
* is preserved.
10
* ====================================================
11
*/
12
13
/* tan(x)
14
* Return tangent function of x.
15
*
16
* kernel function:
17
* __kernel_tan ... tangent 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 <
sys/cdefs.h
>
44
#include <float.h>
45
#include <math.h>
46
47
#include "
math_private.h
"
48
49
double
50
tan
(
double
x)
51
{
52
double
y[2],z=0.0;
53
int32_t
n, ix;
54
55
/* High word of x. */
56
GET_HIGH_WORD
(ix,x);
57
58
/* |x| ~< pi/4 */
59
ix &= 0x7fffffff;
60
if
(ix <= 0x3fe921fb)
return
__kernel_tan
(x,z,1);
61
62
/* tan(Inf or NaN) is NaN */
63
else
if
(ix>=0x7ff00000)
return
x-x;
/* NaN */
64
65
/* argument reduction needed */
66
else
{
67
n =
__ieee754_rem_pio2
(x,y);
68
return
__kernel_tan
(y[0],y[1],1-((n&1)<<1));
/* 1 -- n even
69
-1 -- n odd */
70
}
71
}
72
73
#if LDBL_MANT_DIG == 53
74
#ifdef __weak_alias
75
__weak_alias(tanl,
tan
);
76
#endif
/* __weak_alias */
77
#endif
/* LDBL_MANT_DIG == 53 */
GET_HIGH_WORD
#define GET_HIGH_WORD(i, d)
Definition:
math_private.h:269
tan
double tan(double x)
Definition:
s_tan.c:50
__ieee754_rem_pio2
int32_t __ieee754_rem_pio2(double x, double *y)
Definition:
e_rem_pio2.c:54
__kernel_tan
double __kernel_tan(double x, double y, int iy)
Definition:
k_tan.c:74
cdefs.h
int32_t
signed int int32_t
Definition:
stdint.h:11
math_private.h
epsilon
liba
src
external
openbsd
s_tan.c
Generated by
1.8.14