Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1882 clevermous 1
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
2
/* e_j1f.c -- float version of e_j1.c.
3
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
4
 */
5
 
6
/*
7
 * ====================================================
8
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
9
 *
10
 * Developed at SunPro, a Sun Microsystems, Inc. business.
11
 * Permission to use, copy, modify, and distribute this
12
 * software is freely granted, provided that this notice
13
 * is preserved.
14
 * ====================================================
15
 */
16
 
17
#if defined(LIBM_SCCS) && !defined(lint)
18
static char rcsid[] = "$Id: e_j1f.c,v 1.2 1994/08/18 23:05:35 jtc Exp $";
19
#endif
20
 
21
#include "math.h"
22
#include "math_private.h"
23
 
24
#ifdef __STDC__
25
static float ponef(float), qonef(float);
26
#else
27
static float ponef(), qonef();
28
#endif
29
 
30
#ifdef __STDC__
31
static const float
32
#else
33
static float
34
#endif
35
huge    = 1e30,
36
one	= 1.0,
37
invsqrtpi=  5.6418961287e-01, /* 0x3f106ebb */
38
tpi      =  6.3661974669e-01, /* 0x3f22f983 */
39
	/* R0/S0 on [0,2] */
40
r00  = -6.2500000000e-02, /* 0xbd800000 */
41
r01  =  1.4070566976e-03, /* 0x3ab86cfd */
42
r02  = -1.5995563444e-05, /* 0xb7862e36 */
43
r03  =  4.9672799207e-08, /* 0x335557d2 */
44
s01  =  1.9153760746e-02, /* 0x3c9ce859 */
45
s02  =  1.8594678841e-04, /* 0x3942fab6 */
46
s03  =  1.1771846857e-06, /* 0x359dffc2 */
47
s04  =  5.0463624390e-09, /* 0x31ad6446 */
48
s05  =  1.2354227016e-11; /* 0x2d59567e */
49
 
50
#ifdef __STDC__
51
static const float zero    = 0.0;
52
#else
53
static float zero    = 0.0;
54
#endif
55
 
56
#ifdef __STDC__
57
	float __ieee754_j1f(float x)
58
#else
59
	float __ieee754_j1f(x)
60
	float x;
61
#endif
62
{
63
	float z, s,c,ss,cc,r,u,v,y;
64
	int32_t hx,ix;
65
 
66
	GET_FLOAT_WORD(hx,x);
67
	ix = hx&0x7fffffff;
68
	if(ix>=0x7f800000) return one/x;
69
	y = fabsf(x);
70
	if(ix >= 0x40000000) {	/* |x| >= 2.0 */
71
		s = sinf(y);
72
		c = cosf(y);
73
		ss = -s-c;
74
		cc = s-c;
75
		if(ix<0x7f000000) {  /* make sure y+y not overflow */
76
		    z = cosf(y+y);
77
		    if ((s*c)>zero) cc = z/ss;
78
		    else 	    ss = z/cc;
79
		}
80
	/*
81
	 * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
82
	 * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
83
	 */
84
		if(ix>0x80000000) z = (invsqrtpi*cc)/sqrtf(y);
85
		else {
86
		    u = ponef(y); v = qonef(y);
87
		    z = invsqrtpi*(u*cc-v*ss)/sqrtf(y);
88
		}
89
		if(hx<0) return -z;
90
		else  	 return  z;
91
	}
92
	if(ix<0x32000000) {	/* |x|<2**-27 */
93
	    if(huge+x>one) return (float)0.5*x;/* inexact if x!=0 necessary */
94
	}
95
	z = x*x;
96
	r =  z*(r00+z*(r01+z*(r02+z*r03)));
97
	s =  one+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
98
	r *= x;
99
	return(x*(float)0.5+r/s);
100
}
101
 
102
#ifdef __STDC__
103
static const float U0[5] = {
104
#else
105
static float U0[5] = {
106
#endif
107
 -1.9605709612e-01, /* 0xbe48c331 */
108
  5.0443872809e-02, /* 0x3d4e9e3c */
109
 -1.9125689287e-03, /* 0xbafaaf2a */
110
  2.3525259166e-05, /* 0x37c5581c */
111
 -9.1909917899e-08, /* 0xb3c56003 */
112
};
113
#ifdef __STDC__
114
static const float V0[5] = {
115
#else
116
static float V0[5] = {
117
#endif
118
  1.9916731864e-02, /* 0x3ca3286a */
119
  2.0255257550e-04, /* 0x3954644b */
120
  1.3560879779e-06, /* 0x35b602d4 */
121
  6.2274145840e-09, /* 0x31d5f8eb */
122
  1.6655924903e-11, /* 0x2d9281cf */
123
};
124
 
125
#ifdef __STDC__
126
	float __ieee754_y1f(float x)
127
#else
128
	float __ieee754_y1f(x)
129
	float x;
130
#endif
131
{
132
	float z, s,c,ss,cc,u,v;
133
	int32_t hx,ix;
134
 
135
	GET_FLOAT_WORD(hx,x);
136
        ix = 0x7fffffff&hx;
137
    /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
138
	if(ix>=0x7f800000) return  one/(x+x*x);
139
        if(ix==0) return -one/zero;
140
        if(hx<0) return zero/zero;
141
        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
142
                s = sinf(x);
143
                c = cosf(x);
144
                ss = -s-c;
145
                cc = s-c;
146
                if(ix<0x7f000000) {  /* make sure x+x not overflow */
147
                    z = cosf(x+x);
148
                    if ((s*c)>zero) cc = z/ss;
149
                    else            ss = z/cc;
150
                }
151
        /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
152
         * where x0 = x-3pi/4
153
         *      Better formula:
154
         *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
155
         *                      =  1/sqrt(2) * (sin(x) - cos(x))
156
         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
157
         *                      = -1/sqrt(2) * (cos(x) + sin(x))
158
         * To avoid cancellation, use
159
         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
160
         * to compute the worse one.
161
         */
162
                if(ix>0x48000000) z = (invsqrtpi*ss)/sqrtf(x);
163
                else {
164
                    u = ponef(x); v = qonef(x);
165
                    z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
166
                }
167
                return z;
168
        }
169
        if(ix<=0x24800000) {    /* x < 2**-54 */
170
            return(-tpi/x);
171
        }
172
        z = x*x;
173
        u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
174
        v = one+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4]))));
175
        return(x*(u/v) + tpi*(__ieee754_j1f(x)*__ieee754_logf(x)-one/x));
176
}
177
 
178
/* For x >= 8, the asymptotic expansions of pone is
179
 *	1 + 15/128 s^2 - 4725/2^15 s^4 - ...,	where s = 1/x.
180
 * We approximate pone by
181
 * 	pone(x) = 1 + (R/S)
182
 * where  R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
183
 * 	  S = 1 + ps0*s^2 + ... + ps4*s^10
184
 * and
185
 *	| pone(x)-1-R/S | <= 2  ** ( -60.06)
186
 */
187
 
188
#ifdef __STDC__
189
static const float pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
190
#else
191
static float pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
192
#endif
193
  0.0000000000e+00, /* 0x00000000 */
194
  1.1718750000e-01, /* 0x3df00000 */
195
  1.3239480972e+01, /* 0x4153d4ea */
196
  4.1205184937e+02, /* 0x43ce06a3 */
197
  3.8747453613e+03, /* 0x45722bed */
198
  7.9144794922e+03, /* 0x45f753d6 */
199
};
200
#ifdef __STDC__
201
static const float ps8[5] = {
202
#else
203
static float ps8[5] = {
204
#endif
205
  1.1420736694e+02, /* 0x42e46a2c */
206
  3.6509309082e+03, /* 0x45642ee5 */
207
  3.6956207031e+04, /* 0x47105c35 */
208
  9.7602796875e+04, /* 0x47bea166 */
209
  3.0804271484e+04, /* 0x46f0a88b */
210
};
211
 
212
#ifdef __STDC__
213
static const float pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
214
#else
215
static float pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
216
#endif
217
  1.3199052094e-11, /* 0x2d68333f */
218
  1.1718749255e-01, /* 0x3defffff */
219
  6.8027510643e+00, /* 0x40d9b023 */
220
  1.0830818176e+02, /* 0x42d89dca */
221
  5.1763616943e+02, /* 0x440168b7 */
222
  5.2871520996e+02, /* 0x44042dc6 */
223
};
224
#ifdef __STDC__
225
static const float ps5[5] = {
226
#else
227
static float ps5[5] = {
228
#endif
229
  5.9280597687e+01, /* 0x426d1f55 */
230
  9.9140142822e+02, /* 0x4477d9b1 */
231
  5.3532670898e+03, /* 0x45a74a23 */
232
  7.8446904297e+03, /* 0x45f52586 */
233
  1.5040468750e+03, /* 0x44bc0180 */
234
};
235
 
236
#ifdef __STDC__
237
static const float pr3[6] = {
238
#else
239
static float pr3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
240
#endif
241
  3.0250391081e-09, /* 0x314fe10d */
242
  1.1718686670e-01, /* 0x3defffab */
243
  3.9329774380e+00, /* 0x407bb5e7 */
244
  3.5119403839e+01, /* 0x420c7a45 */
245
  9.1055007935e+01, /* 0x42b61c2a */
246
  4.8559066772e+01, /* 0x42423c7c */
247
};
248
#ifdef __STDC__
249
static const float ps3[5] = {
250
#else
251
static float ps3[5] = {
252
#endif
253
  3.4791309357e+01, /* 0x420b2a4d */
254
  3.3676245117e+02, /* 0x43a86198 */
255
  1.0468714600e+03, /* 0x4482dbe3 */
256
  8.9081134033e+02, /* 0x445eb3ed */
257
  1.0378793335e+02, /* 0x42cf936c */
258
};
259
 
260
#ifdef __STDC__
261
static const float pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
262
#else
263
static float pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
264
#endif
265
  1.0771083225e-07, /* 0x33e74ea8 */
266
  1.1717621982e-01, /* 0x3deffa16 */
267
  2.3685150146e+00, /* 0x401795c0 */
268
  1.2242610931e+01, /* 0x4143e1bc */
269
  1.7693971634e+01, /* 0x418d8d41 */
270
  5.0735230446e+00, /* 0x40a25a4d */
271
};
272
#ifdef __STDC__
273
static const float ps2[5] = {
274
#else
275
static float ps2[5] = {
276
#endif
277
  2.1436485291e+01, /* 0x41ab7dec */
278
  1.2529022980e+02, /* 0x42fa9499 */
279
  2.3227647400e+02, /* 0x436846c7 */
280
  1.1767937469e+02, /* 0x42eb5bd7 */
281
  8.3646392822e+00, /* 0x4105d590 */
282
};
283
 
284
#ifdef __STDC__
285
	static float ponef(float x)
286
#else
287
	static float ponef(x)
288
	float x;
289
#endif
290
{
291
#ifdef __STDC__
292
	const float *p,*q;
293
#else
294
	float *p,*q;
295
#endif
296
	float z,r,s;
297
        int32_t ix;
298
	GET_FLOAT_WORD(ix,x);
299
	ix &= 0x7fffffff;
300
        if(ix>=0x41000000)     {p = pr8; q= ps8;}
301
        else if(ix>=0x40f71c58){p = pr5; q= ps5;}
302
        else if(ix>=0x4036db68){p = pr3; q= ps3;}
303
        else if(ix>=0x40000000){p = pr2; q= ps2;}
304
        z = one/(x*x);
305
        r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
306
        s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
307
        return one+ r/s;
308
}
309
 
310
 
311
/* For x >= 8, the asymptotic expansions of qone is
312
 *	3/8 s - 105/1024 s^3 - ..., where s = 1/x.
313
 * We approximate pone by
314
 * 	qone(x) = s*(0.375 + (R/S))
315
 * where  R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
316
 * 	  S = 1 + qs1*s^2 + ... + qs6*s^12
317
 * and
318
 *	| qone(x)/s -0.375-R/S | <= 2  ** ( -61.13)
319
 */
320
 
321
#ifdef __STDC__
322
static const float qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
323
#else
324
static float qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
325
#endif
326
  0.0000000000e+00, /* 0x00000000 */
327
 -1.0253906250e-01, /* 0xbdd20000 */
328
 -1.6271753311e+01, /* 0xc1822c8d */
329
 -7.5960174561e+02, /* 0xc43de683 */
330
 -1.1849806641e+04, /* 0xc639273a */
331
 -4.8438511719e+04, /* 0xc73d3683 */
332
};
333
#ifdef __STDC__
334
static const float qs8[6] = {
335
#else
336
static float qs8[6] = {
337
#endif
338
  1.6139537048e+02, /* 0x43216537 */
339
  7.8253862305e+03, /* 0x45f48b17 */
340
  1.3387534375e+05, /* 0x4802bcd6 */
341
  7.1965775000e+05, /* 0x492fb29c */
342
  6.6660125000e+05, /* 0x4922be94 */
343
 -2.9449025000e+05, /* 0xc88fcb48 */
344
};
345
 
346
#ifdef __STDC__
347
static const float qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
348
#else
349
static float qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
350
#endif
351
 -2.0897993405e-11, /* 0xadb7d219 */
352
 -1.0253904760e-01, /* 0xbdd1fffe */
353
 -8.0564479828e+00, /* 0xc100e736 */
354
 -1.8366960144e+02, /* 0xc337ab6b */
355
 -1.3731937256e+03, /* 0xc4aba633 */
356
 -2.6124443359e+03, /* 0xc523471c */
357
};
358
#ifdef __STDC__
359
static const float qs5[6] = {
360
#else
361
static float qs5[6] = {
362
#endif
363
  8.1276550293e+01, /* 0x42a28d98 */
364
  1.9917987061e+03, /* 0x44f8f98f */
365
  1.7468484375e+04, /* 0x468878f8 */
366
  4.9851425781e+04, /* 0x4742bb6d */
367
  2.7948074219e+04, /* 0x46da5826 */
368
 -4.7191835938e+03, /* 0xc5937978 */
369
};
370
 
371
#ifdef __STDC__
372
static const float qr3[6] = {
373
#else
374
static float qr3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
375
#endif
376
 -5.0783124372e-09, /* 0xb1ae7d4f */
377
 -1.0253783315e-01, /* 0xbdd1ff5b */
378
 -4.6101160049e+00, /* 0xc0938612 */
379
 -5.7847221375e+01, /* 0xc267638e */
380
 -2.2824453735e+02, /* 0xc3643e9a */
381
 -2.1921012878e+02, /* 0xc35b35cb */
382
};
383
#ifdef __STDC__
384
static const float qs3[6] = {
385
#else
386
static float qs3[6] = {
387
#endif
388
  4.7665153503e+01, /* 0x423ea91e */
389
  6.7386511230e+02, /* 0x4428775e */
390
  3.3801528320e+03, /* 0x45534272 */
391
  5.5477290039e+03, /* 0x45ad5dd5 */
392
  1.9031191406e+03, /* 0x44ede3d0 */
393
 -1.3520118713e+02, /* 0xc3073381 */
394
};
395
 
396
#ifdef __STDC__
397
static const float qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
398
#else
399
static float qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
400
#endif
401
 -1.7838172539e-07, /* 0xb43f8932 */
402
 -1.0251704603e-01, /* 0xbdd1f475 */
403
 -2.7522056103e+00, /* 0xc0302423 */
404
 -1.9663616180e+01, /* 0xc19d4f16 */
405
 -4.2325313568e+01, /* 0xc2294d1f */
406
 -2.1371921539e+01, /* 0xc1aaf9b2 */
407
};
408
#ifdef __STDC__
409
static const float qs2[6] = {
410
#else
411
static float qs2[6] = {
412
#endif
413
  2.9533363342e+01, /* 0x41ec4454 */
414
  2.5298155212e+02, /* 0x437cfb47 */
415
  7.5750280762e+02, /* 0x443d602e */
416
  7.3939318848e+02, /* 0x4438d92a */
417
  1.5594900513e+02, /* 0x431bf2f2 */
418
 -4.9594988823e+00, /* 0xc09eb437 */
419
};
420
 
421
#ifdef __STDC__
422
	static float qonef(float x)
423
#else
424
	static float qonef(x)
425
	float x;
426
#endif
427
{
428
#ifdef __STDC__
429
	const float *p,*q;
430
#else
431
	float *p,*q;
432
#endif
433
	float  s,r,z;
434
	int32_t ix;
435
	GET_FLOAT_WORD(ix,x);
436
	ix &= 0x7fffffff;
437
	if(ix>=0x40200000)     {p = qr8; q= qs8;}
438
	else if(ix>=0x40f71c58){p = qr5; q= qs5;}
439
	else if(ix>=0x4036db68){p = qr3; q= qs3;}
440
	else if(ix>=0x40000000){p = qr2; q= qs2;}
441
	z = one/(x*x);
442
	r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
443
	s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
444
	return ((float).375 + r/s)/x;
445
}