|
|
1.1 root 1: .\" Copyright (c) 1985 Regents of the University of California.
2: .\" All rights reserved. The Berkeley software License Agreement
3: .\" specifies the terms and conditions for redistribution.
4: .\"
5: .\" @(#)sin.3 6.6 (Berkeley) 5/12/86
6: .\"
7: .TH SIN 3M "May 12, 1986"
8: .UC 4
9: .de Pi \" PI stuff sign
10: .if n \\
11: \\$2pi\\$1
12: .if t \\
13: \\$2\\(*p\\$1
14: ..
15: .ds up \fIulp\fR
16: .SH NAME
17: sin, cos, tan, asin, acos, atan, atan2 \- trigonometric functions
18: and their inverses
19: .SH SYNOPSIS
20: .nf
21: .B #include <math.h>
22: .PP
23: .B double sin(x)
24: .B double x;
25: .PP
26: .B double cos(x)
27: .B double x;
28: .PP
29: .B double tan(x)
30: .B double x;
31: .PP
32: .B double asin(x)
33: .B double x;
34: .PP
35: .B double acos(x)
36: .B double x;
37: .PP
38: .B double atan(x)
39: .B double x;
40: .PP
41: .B double atan2(y,x)
42: .B double y,x;
43: .fi
44: .SH DESCRIPTION
45: Sin, cos and tan
46: return trigonometric functions of radian arguments x.
47: .PP
48: Asin returns the arc sine in the range
49: .Pi /2 \-
50: to
51: .Pi /2.
52: .PP
53: Acos returns the arc cosine in the range 0 to
54: .Pi.
55: .PP
56: Atan returns the arc tangent in the range
57: .Pi /2 \-
58: to
59: .Pi /2.
60: .PP
61: On a VAX,
62: .nf
63: .if n \{\
64: .ta \w'atan2(y,x) := 'u+2n +\w'sign(y)\(**(pi \- atan(|y/x|))'u+2n
65: atan2(y,x) := atan(y/x) if x > 0,
66: sign(y)\(**(pi \- atan(|y/x|)) if x < 0,
67: 0 if x = y = 0, or
68: sign(y)\(**pi/2 if x = 0 != y. \}
69: .if t \{\
70: .ta \w'atan2(y,x) := 'u+2n +\w'sign(y)\(**(\(*p \- atan(|y/x|))'u+2n
71: atan2(y,x) := atan(y/x) if x > 0,
72: sign(y)\(**(\(*p \- atan(|y/x|)) if x < 0,
73: 0 if x = y = 0, or
74: sign(y)\(**\(*p/2 if x = 0 \(!= y. \}
75: .ta
76: .fi
77: .SH DIAGNOSTICS
78: On a VAX, if |x| > 1 then asin(x) and acos(x)
79: will return reserved operands and \fIerrno\fR will be set to EDOM.
80: .SH NOTES
81: Atan2 defines atan2(0,0) = 0 on a VAX despite that previously
82: atan2(0,0) may have generated an error message.
83: The reasons for assigning a value to atan2(0,0) are these:
84: .IP (1) \w'\0\0\0\0'u
85: Programs that test arguments to avoid computing
86: atan2(0,0) must be indifferent to its value.
87: Programs that require it to be invalid are vulnerable
88: to diverse reactions to that invalidity on diverse computer systems.
89: .IP (2) \w'\0\0\0\0'u
90: Atan2 is used mostly to convert from rectangular (x,y)
91: to polar
92: .if n\
93: (r,theta)
94: .if t\
95: (r,\(*h)
96: coordinates that must satisfy x =
97: .if n\
98: r\(**cos theta
99: .if t\
100: r\(**cos\(*h
101: and y =
102: .if n\
103: r\(**sin theta.
104: .if t\
105: r\(**sin\(*h.
106: These equations are satisfied when (x=0,y=0)
107: is mapped to
108: .if n \
109: (r=0,theta=0)
110: .if t \
111: (r=0,\(*h=0)
112: on a VAX. In general, conversions to polar coordinates
113: should be computed thus:
114: .nf
115: .ta 1iR +1n +\w' := hypot(x,y);'u+0.5i
116: .if n \{\
117: r := hypot(x,y); ... := sqrt(x\(**x+y\(**y)
118: theta := atan2(y,x).
119: .ta \}
120: .if t \{\
121: r := hypot(x,y); ... := \(sr(x\u\s82\s10\d+y\u\s82\s10\d)
122: \(*h := atan2(y,x).
123: .ta \}
124: .fi
125: .IP (3) \w'\0\0\0\0'u
126: The foregoing formulas need not be altered to cope in a
127: reasonable way with signed zeros and infinities
128: on a machine that conforms to IEEE 754;
129: the versions of hypot and atan2 provided for
130: such a machine are designed to handle all cases.
131: That is why atan2(\(+-0,\-0) =
132: .Pi , \(+-
133: for instance.
134: In general the formulas above are equivalent to these:
135: .RS
136: .nf
137: .if n \
138: r := sqrt(x\(**x+y\(**y); if r = 0 then x := copysign(1,x);
139: .if t \
140: r := \(sr(x\(**x+y\(**y);\0\0if r = 0 then x := copysign(1,x);
141: .br
142: .if n \
143: .ta 1i
144: .if t \
145: .ta \w'if x > 0'u+2n +\w'then'u+2n
146: .if n \
147: if x > 0 then theta := 2\(**atan(y/(r+x))
148: .if t \
149: if x > 0 then \(*h := 2\(**atan(y/(r+x))
150: .if n \
151: else theta := 2\(**atan((r\-x)/y);
152: .if t \
153: else \(*h := 2\(**atan((r\-x)/y);
154: .fi
155: .RE
156: except if r is infinite then atan2 will yield an
157: appropriate multiple of
158: .Pi /4
159: that would otherwise have to be obtained by taking limits.
160: .SH ERROR (due to Roundoff etc.)
161: Let P stand for the number stored in the computer in place of
162: .Pi " = 3.14159 26535 89793 23846 26433 ... ."
163: Let "trig" stand for one of "sin", "cos" or "tan". Then
164: the expression "trig(x)" in a program actually produces an
165: approximation to
166: .Pi /P), trig(x\(**
167: and "atrig(x)" approximates
168: .Pi )\(**atrig(x). (P/
169: The approximations are close, within 0.9 \*(ups for sin,
170: cos and atan, within 2.2 \*(ups for tan, asin,
171: acos and atan2 on a VAX. Moreover,
172: .Pi \& "P = "
173: in the codes that run on a VAX.
174:
175: In the codes that run on other machines, P differs from
176: .Pi
177: by a fraction of an \*(up; the difference matters only if the argument
178: x is huge, and even then the difference is likely to be swamped by
179: the uncertainty in x. Besides, every trigonometric identity that
180: does not involve
181: .Pi
182: explicitly is satisfied equally well regardless of whether
183: .Pi . "P = "
184: For instance,
185: .if n \
186: sin(x)**2+cos(x)**2\0=\01
187: .if t \
188: sin\u\s62\s10\d(x)+cos\u\s62\s10\d(x)\0=\01
189: and sin(2x)\0=\02\|sin(x)cos(x) to within a few \*(ups no matter how big
190: x may be. Therefore the difference between P and
191: .Pi
192: is most unlikely to affect scientific and engineering computations.
193: .SH SEE ALSO
194: math(3M), hypot(3M), sqrt(3M), infnan(3M)
195: .SH AUTHOR
196: Robert P. Corbett, W. Kahan, Stuart\0I.\0McDonald, Peter\0Tang and,
197: for the codes for IEEE 754, Dr. Kwok\-Choi\0Ng.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.