n_asincos.c revision 1.2 1 1.2 ragge /* $NetBSD: n_asincos.c,v 1.2 1997/10/20 14:11:49 ragge Exp $ */
2 1.1 ragge /*
3 1.1 ragge * Copyright (c) 1985, 1993
4 1.1 ragge * The Regents of the University of California. All rights reserved.
5 1.1 ragge *
6 1.1 ragge * Redistribution and use in source and binary forms, with or without
7 1.1 ragge * modification, are permitted provided that the following conditions
8 1.1 ragge * are met:
9 1.1 ragge * 1. Redistributions of source code must retain the above copyright
10 1.1 ragge * notice, this list of conditions and the following disclaimer.
11 1.1 ragge * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 ragge * notice, this list of conditions and the following disclaimer in the
13 1.1 ragge * documentation and/or other materials provided with the distribution.
14 1.1 ragge * 3. All advertising materials mentioning features or use of this software
15 1.1 ragge * must display the following acknowledgement:
16 1.1 ragge * This product includes software developed by the University of
17 1.1 ragge * California, Berkeley and its contributors.
18 1.1 ragge * 4. Neither the name of the University nor the names of its contributors
19 1.1 ragge * may be used to endorse or promote products derived from this software
20 1.1 ragge * without specific prior written permission.
21 1.1 ragge *
22 1.1 ragge * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.1 ragge * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 ragge * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 ragge * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.1 ragge * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1 ragge * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1 ragge * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1 ragge * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1 ragge * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 ragge * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 ragge * SUCH DAMAGE.
33 1.1 ragge */
34 1.1 ragge
35 1.1 ragge #ifndef lint
36 1.2 ragge #if 0
37 1.1 ragge static char sccsid[] = "@(#)asincos.c 8.1 (Berkeley) 6/4/93";
38 1.2 ragge #endif
39 1.1 ragge #endif /* not lint */
40 1.1 ragge
41 1.1 ragge /* ASIN(X)
42 1.1 ragge * RETURNS ARC SINE OF X
43 1.1 ragge * DOUBLE PRECISION (IEEE DOUBLE 53 bits, VAX D FORMAT 56 bits)
44 1.1 ragge * CODED IN C BY K.C. NG, 4/16/85, REVISED ON 6/10/85.
45 1.1 ragge *
46 1.1 ragge * Required system supported functions:
47 1.1 ragge * copysign(x,y)
48 1.1 ragge * sqrt(x)
49 1.1 ragge *
50 1.1 ragge * Required kernel function:
51 1.1 ragge * atan2(y,x)
52 1.1 ragge *
53 1.1 ragge * Method :
54 1.1 ragge * asin(x) = atan2(x,sqrt(1-x*x)); for better accuracy, 1-x*x is
55 1.1 ragge * computed as follows
56 1.1 ragge * 1-x*x if x < 0.5,
57 1.1 ragge * 2*(1-|x|)-(1-|x|)*(1-|x|) if x >= 0.5.
58 1.1 ragge *
59 1.1 ragge * Special cases:
60 1.1 ragge * if x is NaN, return x itself;
61 1.1 ragge * if |x|>1, return NaN.
62 1.1 ragge *
63 1.1 ragge * Accuracy:
64 1.1 ragge * 1) If atan2() uses machine PI, then
65 1.1 ragge *
66 1.1 ragge * asin(x) returns (PI/pi) * (the exact arc sine of x) nearly rounded;
67 1.1 ragge * and PI is the exact pi rounded to machine precision (see atan2 for
68 1.1 ragge * details):
69 1.1 ragge *
70 1.1 ragge * in decimal:
71 1.1 ragge * pi = 3.141592653589793 23846264338327 .....
72 1.1 ragge * 53 bits PI = 3.141592653589793 115997963 ..... ,
73 1.1 ragge * 56 bits PI = 3.141592653589793 227020265 ..... ,
74 1.1 ragge *
75 1.1 ragge * in hexadecimal:
76 1.1 ragge * pi = 3.243F6A8885A308D313198A2E....
77 1.1 ragge * 53 bits PI = 3.243F6A8885A30 = 2 * 1.921FB54442D18 error=.276ulps
78 1.1 ragge * 56 bits PI = 3.243F6A8885A308 = 4 * .C90FDAA22168C2 error=.206ulps
79 1.1 ragge *
80 1.1 ragge * In a test run with more than 200,000 random arguments on a VAX, the
81 1.1 ragge * maximum observed error in ulps (units in the last place) was
82 1.1 ragge * 2.06 ulps. (comparing against (PI/pi)*(exact asin(x)));
83 1.1 ragge *
84 1.1 ragge * 2) If atan2() uses true pi, then
85 1.1 ragge *
86 1.1 ragge * asin(x) returns the exact asin(x) with error below about 2 ulps.
87 1.1 ragge *
88 1.1 ragge * In a test run with more than 1,024,000 random arguments on a VAX, the
89 1.1 ragge * maximum observed error in ulps (units in the last place) was
90 1.1 ragge * 1.99 ulps.
91 1.1 ragge */
92 1.1 ragge
93 1.1 ragge #include "mathimpl.h"
94 1.1 ragge
95 1.1 ragge double
96 1.1 ragge asin(x)
97 1.1 ragge double x;
98 1.1 ragge {
99 1.2 ragge double s,t,one=1.0;
100 1.1 ragge #if !defined(vax)&&!defined(tahoe)
101 1.1 ragge if(x!=x) return(x); /* x is NaN */
102 1.1 ragge #endif /* !defined(vax)&&!defined(tahoe) */
103 1.1 ragge s=copysign(x,one);
104 1.1 ragge if(s <= 0.5)
105 1.1 ragge return(atan2(x,sqrt(one-x*x)));
106 1.1 ragge else
107 1.1 ragge { t=one-s; s=t+t; return(atan2(x,sqrt(s-t*t))); }
108 1.1 ragge
109 1.1 ragge }
110 1.1 ragge
111 1.1 ragge /* ACOS(X)
112 1.1 ragge * RETURNS ARC COS OF X
113 1.1 ragge * DOUBLE PRECISION (IEEE DOUBLE 53 bits, VAX D FORMAT 56 bits)
114 1.1 ragge * CODED IN C BY K.C. NG, 4/16/85, REVISED ON 6/10/85.
115 1.1 ragge *
116 1.1 ragge * Required system supported functions:
117 1.1 ragge * copysign(x,y)
118 1.1 ragge * sqrt(x)
119 1.1 ragge *
120 1.1 ragge * Required kernel function:
121 1.1 ragge * atan2(y,x)
122 1.1 ragge *
123 1.1 ragge * Method :
124 1.1 ragge * ________
125 1.1 ragge * / 1 - x
126 1.1 ragge * acos(x) = 2*atan2( / -------- , 1 ) .
127 1.1 ragge * \/ 1 + x
128 1.1 ragge *
129 1.1 ragge * Special cases:
130 1.1 ragge * if x is NaN, return x itself;
131 1.1 ragge * if |x|>1, return NaN.
132 1.1 ragge *
133 1.1 ragge * Accuracy:
134 1.1 ragge * 1) If atan2() uses machine PI, then
135 1.1 ragge *
136 1.1 ragge * acos(x) returns (PI/pi) * (the exact arc cosine of x) nearly rounded;
137 1.1 ragge * and PI is the exact pi rounded to machine precision (see atan2 for
138 1.1 ragge * details):
139 1.1 ragge *
140 1.1 ragge * in decimal:
141 1.1 ragge * pi = 3.141592653589793 23846264338327 .....
142 1.1 ragge * 53 bits PI = 3.141592653589793 115997963 ..... ,
143 1.1 ragge * 56 bits PI = 3.141592653589793 227020265 ..... ,
144 1.1 ragge *
145 1.1 ragge * in hexadecimal:
146 1.1 ragge * pi = 3.243F6A8885A308D313198A2E....
147 1.1 ragge * 53 bits PI = 3.243F6A8885A30 = 2 * 1.921FB54442D18 error=.276ulps
148 1.1 ragge * 56 bits PI = 3.243F6A8885A308 = 4 * .C90FDAA22168C2 error=.206ulps
149 1.1 ragge *
150 1.1 ragge * In a test run with more than 200,000 random arguments on a VAX, the
151 1.1 ragge * maximum observed error in ulps (units in the last place) was
152 1.1 ragge * 2.07 ulps. (comparing against (PI/pi)*(exact acos(x)));
153 1.1 ragge *
154 1.1 ragge * 2) If atan2() uses true pi, then
155 1.1 ragge *
156 1.1 ragge * acos(x) returns the exact acos(x) with error below about 2 ulps.
157 1.1 ragge *
158 1.1 ragge * In a test run with more than 1,024,000 random arguments on a VAX, the
159 1.1 ragge * maximum observed error in ulps (units in the last place) was
160 1.1 ragge * 2.15 ulps.
161 1.1 ragge */
162 1.1 ragge
163 1.1 ragge double
164 1.1 ragge acos(x)
165 1.1 ragge double x;
166 1.1 ragge {
167 1.2 ragge double t,one=1.0;
168 1.1 ragge #if !defined(vax)&&!defined(tahoe)
169 1.1 ragge if(x!=x) return(x);
170 1.1 ragge #endif /* !defined(vax)&&!defined(tahoe) */
171 1.1 ragge if( x != -1.0)
172 1.1 ragge t=atan2(sqrt((one-x)/(one+x)),one);
173 1.1 ragge else
174 1.1 ragge t=atan2(one,0.0); /* t = PI/2 */
175 1.1 ragge return(t+t);
176 1.1 ragge }
177