This source file includes following definitions.
- asinl
- asinl
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include <config.h>
30
31
32 #include <math.h>
33
34 #if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
35
36 long double
37 asinl (long double x)
38 {
39 return asin (x);
40 }
41
42 #else
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 static const long double
69 one = 1.0L,
70 huge = 1.0e+4932L,
71 pio2_hi = 1.5707963267948966192313216916397514420986L,
72 pio2_lo = 4.3359050650618905123985220130216759843812E-35L,
73 pio4_hi = 7.8539816339744830961566084581987569936977E-1L,
74
75
76
77
78
79
80 pS0 = -8.358099012470680544198472400254596543711E2L,
81 pS1 = 3.674973957689619490312782828051860366493E3L,
82 pS2 = -6.730729094812979665807581609853656623219E3L,
83 pS3 = 6.643843795209060298375552684423454077633E3L,
84 pS4 = -3.817341990928606692235481812252049415993E3L,
85 pS5 = 1.284635388402653715636722822195716476156E3L,
86 pS6 = -2.410736125231549204856567737329112037867E2L,
87 pS7 = 2.219191969382402856557594215833622156220E1L,
88 pS8 = -7.249056260830627156600112195061001036533E-1L,
89 pS9 = 1.055923570937755300061509030361395604448E-3L,
90
91 qS0 = -5.014859407482408326519083440151745519205E3L,
92 qS1 = 2.430653047950480068881028451580393430537E4L,
93 qS2 = -4.997904737193653607449250593976069726962E4L,
94 qS3 = 5.675712336110456923807959930107347511086E4L,
95 qS4 = -3.881523118339661268482937768522572588022E4L,
96 qS5 = 1.634202194895541569749717032234510811216E4L,
97 qS6 = -4.151452662440709301601820849901296953752E3L,
98 qS7 = 5.956050864057192019085175976175695342168E2L,
99 qS8 = -4.175375777334867025769346564600396877176E1L,
100
101
102
103
104
105 rS0 = -5.619049346208901520945464704848780243887E0L,
106 rS1 = 4.460504162777731472539175700169871920352E1L,
107 rS2 = -1.317669505315409261479577040530751477488E2L,
108 rS3 = 1.626532582423661989632442410808596009227E2L,
109 rS4 = -3.144806644195158614904369445440583873264E1L,
110 rS5 = -9.806674443470740708765165604769099559553E1L,
111 rS6 = 5.708468492052010816555762842394927806920E1L,
112 rS7 = 1.396540499232262112248553357962639431922E1L,
113 rS8 = -1.126243289311910363001762058295832610344E1L,
114 rS9 = -4.956179821329901954211277873774472383512E-1L,
115 rS10 = 3.313227657082367169241333738391762525780E-1L,
116
117 sS0 = -4.645814742084009935700221277307007679325E0L,
118 sS1 = 3.879074822457694323970438316317961918430E1L,
119 sS2 = -1.221986588013474694623973554726201001066E2L,
120 sS3 = 1.658821150347718105012079876756201905822E2L,
121 sS4 = -4.804379630977558197953176474426239748977E1L,
122 sS5 = -1.004296417397316948114344573811562952793E2L,
123 sS6 = 7.530281592861320234941101403870010111138E1L,
124 sS7 = 1.270735595411673647119592092304357226607E1L,
125 sS8 = -1.815144839646376500705105967064792930282E1L,
126 sS9 = -7.821597334910963922204235247786840828217E-2L,
127
128
129 asinr5625 = 5.9740641664535021430381036628424864397707E-1L;
130
131
132 long double
133 asinl (long double x)
134 {
135 long double y, t, p, q;
136 int sign;
137
138 sign = 1;
139 y = x;
140 if (x < 0.0L)
141 {
142 sign = -1;
143 y = -x;
144 }
145
146 if (y >= 1.0L)
147 {
148 if (y == 1.0L)
149
150 return x * pio2_hi + x * pio2_lo;
151
152 return (x - x) / (x - x);
153 }
154 else if (y < 0.5L)
155 {
156 if (y < 0.000000000000000006938893903907228377647697925567626953125L)
157 if (huge + y > one)
158 return y;
159
160 t = x * x;
161 p = (((((((((pS9 * t
162 + pS8) * t
163 + pS7) * t
164 + pS6) * t
165 + pS5) * t
166 + pS4) * t
167 + pS3) * t
168 + pS2) * t
169 + pS1) * t
170 + pS0) * t;
171
172 q = (((((((( t
173 + qS8) * t
174 + qS7) * t
175 + qS6) * t
176 + qS5) * t
177 + qS4) * t
178 + qS3) * t
179 + qS2) * t
180 + qS1) * t
181 + qS0;
182
183 return x + x * (p / q);
184 }
185
186 else if (y < 0.625)
187 {
188 t = y - 0.5625;
189 p = ((((((((((rS10 * t
190 + rS9) * t
191 + rS8) * t
192 + rS7) * t
193 + rS6) * t
194 + rS5) * t
195 + rS4) * t
196 + rS3) * t
197 + rS2) * t
198 + rS1) * t
199 + rS0) * t;
200
201 q = ((((((((( t
202 + sS9) * t
203 + sS8) * t
204 + sS7) * t
205 + sS6) * t
206 + sS5) * t
207 + sS4) * t
208 + sS3) * t
209 + sS2) * t
210 + sS1) * t
211 + sS0;
212 t = asinr5625 + p / q;
213 }
214 else
215 t = pio2_hi + pio2_lo - 2 * asinl (sqrtl ((1 - y) / 2));
216
217 return t * sign;
218 }
219
220 #endif
221
222 #if 0
223 int
224 main (void)
225 {
226 printf ("%.18Lg %.18Lg\n",
227 asinl (1.0L),
228 1.5707963267948966192313216916397514420984L);
229 printf ("%.18Lg %.18Lg\n",
230 asinl (0.7071067811865475244008443621048490392848L),
231 0.7853981633974483096156608458198757210492L);
232 printf ("%.18Lg %.18Lg\n",
233 asinl (0.5L),
234 0.5235987755982988730771072305465838140328L);
235 printf ("%.18Lg %.18Lg\n",
236 asinl (0.3090169943749474241022934171828190588600L),
237 0.3141592653589793238462643383279502884196L);
238 printf ("%.18Lg %.18Lg\n",
239 asinl (-1.0L),
240 -1.5707963267948966192313216916397514420984L);
241 printf ("%.18Lg %.18Lg\n",
242 asinl (-0.7071067811865475244008443621048490392848L),
243 -0.7853981633974483096156608458198757210492L);
244 printf ("%.18Lg %.18Lg\n",
245 asinl (-0.5L),
246 -0.5235987755982988730771072305465838140328L);
247 printf ("%.18Lg %.18Lg\n",
248 asinl (-0.3090169943749474241022934171828190588600L),
249 -0.3141592653589793238462643383279502884196L);
250 }
251 #endif