master
  1#include <math.h>
  2#include <errno.h>
  3
  4
  5#define IBMPC 1
  6#define ANSIPROT 1
  7#define MINUSZERO 1
  8#define INFINITIES 1
  9#define NANS 1
 10#define DENORMAL 1
 11#define VOLATILE
 12#define mtherr(fname, code)
 13#define XPD 0,
 14#ifdef __x86_64__
 15#define XPD_SHORT 0, 0,
 16#define XPD_LONG 0,
 17#else
 18#define XPD_SHORT
 19#define XPD_LONG
 20#endif
 21
 22#if UNK
 23typedef union uLD { long double ld; unsigned short sh[8]; long lo[4]; } uLD;
 24typedef union uD { double d; unsigned short sh[4]; } uD;
 25#elif IBMPC
 26typedef union uLD { unsigned short sh[8]; long double ld; long lo[4]; } uLD;
 27typedef union uD { unsigned short sh[4]; double d; } uD;
 28#elif MIEEE
 29typedef union uLD { long lo[4]; long double ld; unsigned short sh[8]; } uLD;
 30typedef union uD { unsigned short sh[4]; double d; } uD;
 31#else
 32#error Unknown uLD/uD type definition
 33#endif
 34
 35#define _CEPHES_USE_ERRNO
 36
 37#ifdef _CEPHES_USE_ERRNO
 38#define _SET_ERRNO(x) errno = (x)
 39#else
 40#define _SET_ERRNO(x)
 41#endif
 42
 43/* constants used by cephes functions */
 44
 45/* double */
 46#define MAXNUM	1.7976931348623158E308
 47#define MAXLOG	7.09782712893383996843E2
 48#define MINLOG	-7.08396418532264106224E2
 49#define LOGE2	6.93147180559945309417E-1
 50#define LOG2E	1.44269504088896340736
 51#define PI	3.14159265358979323846
 52#define PIO2	1.57079632679489661923
 53#define PIO4	7.85398163397448309616E-1
 54
 55#define NEGZERO (-0.0)
 56#undef NAN
 57#undef INFINITY
 58#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
 59#define INFINITY __builtin_huge_val()
 60#define NAN __builtin_nan("")
 61#else
 62extern double __INF;
 63#define INFINITY (__INF)
 64extern double __QNAN;
 65#define NAN (__QNAN)
 66#endif
 67
 68/*long double*/
 69#if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__
 70#define MAXNUML	1.7976931348623158E308
 71#define MAXLOGL	7.09782712893383996843E2
 72#define MINLOGL	-7.08396418532264106224E2
 73#define LOGE2L	6.93147180559945309417E-1
 74#define LOG2EL	1.44269504088896340736
 75#define PIL	3.14159265358979323846
 76#define PIO2L	1.57079632679489661923
 77#define PIO4L	7.85398163397448309616E-1
 78#else
 79#define MAXNUML 1.189731495357231765021263853E4932L
 80#define MAXLOGL	1.1356523406294143949492E4L
 81#define MINLOGL	-1.13994985314888605586758E4L
 82#define LOGE2L	6.9314718055994530941723E-1L
 83#define LOG2EL	1.4426950408889634073599E0L
 84#define PIL	3.1415926535897932384626L
 85#define PIO2L	1.5707963267948966192313L
 86#define PIO4L	7.8539816339744830961566E-1L
 87#endif /* __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__ */
 88
 89#define isfinitel isfinite
 90#define isinfl isinf
 91#define isnanl isnan
 92#define signbitl signbit
 93
 94#define NEGZEROL (-0.0L)
 95
 96#undef NANL
 97#undef INFINITYL
 98#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
 99#define INFINITYL __builtin_huge_vall()
100#define NANL __builtin_nanl("")
101#else
102extern long double __INFL;
103#define INFINITYL (__INFL)
104extern long double __QNANL;
105#define NANL (__QNANL)
106#endif
107
108/* float */
109
110#define MAXNUMF	3.4028234663852885981170418348451692544e38F
111#define MAXLOGF	88.72283905206835F
112#define MINLOGF	-103.278929903431851103F /* log(2^-149) */
113#define LOG2EF	1.44269504088896341F
114#define LOGE2F	0.693147180559945309F
115#define PIF	3.141592653589793238F
116#define PIO2F	1.5707963267948966192F
117#define PIO4F	0.7853981633974483096F
118
119#define isfinitef isfinite
120#define isinff isinf
121#define isnanf isnan
122#define signbitf signbit
123
124#define NEGZEROF (-0.0F)
125
126#undef NANF
127#undef INFINITYF
128#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
129#define INFINITYF __builtin_huge_valf()
130#define NANF __builtin_nanf("")
131#else
132extern float __INFF;
133#define INFINITYF (__INFF)
134extern float __QNANF;
135#define NANF (__QNANF)
136#endif
137
138
139/* double */
140
141/*
142Cephes Math Library Release 2.2:  July, 1992
143Copyright 1984, 1987, 1988, 1992 by Stephen L. Moshier
144Direct inquiries to 30 Frost Street, Cambridge, MA 02140
145*/
146
147
148/*							polevl.c
149 *							p1evl.c
150 *
151 *	Evaluate polynomial
152 *
153 *
154 *
155 * SYNOPSIS:
156 *
157 * int N;
158 * double x, y, coef[N+1], polevl[];
159 *
160 * y = polevl( x, coef, N );
161 *
162 *
163 *
164 * DESCRIPTION:
165 *
166 * Evaluates polynomial of degree N:
167 *
168 *                     2          N
169 * y  =  C  + C x + C x  +...+ C x
170 *        0    1     2          N
171 *
172 * Coefficients are stored in reverse order:
173 *
174 * coef[0] = C  , ..., coef[N] = C  .
175 *            N                   0
176 *
177 *  The function p1evl() assumes that coef[N] = 1.0 and is
178 * omitted from the array.  Its calling arguments are
179 * otherwise the same as polevl().
180 *
181 *
182 * SPEED:
183 *
184 * In the interest of speed, there are no checks for out
185 * of bounds arithmetic.  This routine is used by most of
186 * the functions in the library.  Depending on available
187 * equipment features, the user may wish to rewrite the
188 * program in microcode or assembly language.
189 *
190 */
191
192/* Polynomial evaluator:
193 *  P[0] x^n  +  P[1] x^(n-1)  +  ...  +  P[n]
194 */
195static __inline__ double polevl(double x, const uD *p, int n)
196{
197	register double y;
198
199	y = p->d;
200	p++;
201	do
202	{
203		y = y * x + p->d;
204		p++;
205	}
206	while (--n);
207	return (y);
208}
209
210
211/* Polynomial evaluator:
212 *  x^n  +  P[0] x^(n-1)  +  P[1] x^(n-2)  +  ...  +  P[n]
213 */
214static __inline__  double p1evl(double x, const uD *p, int n)
215{
216	register double y;
217
218	n -= 1;
219	y = x + p->d; p++;
220	do
221	{
222		y = y * x + p->d; p++;
223	}
224	while (--n);
225	return (y);
226}
227
228
229/* long double */
230/*
231Cephes Math Library Release 2.2:  July, 1992
232Copyright 1984, 1987, 1988, 1992 by Stephen L. Moshier
233Direct inquiries to 30 Frost Street, Cambridge, MA 02140
234*/
235
236
237/*							polevll.c
238 *							p1evll.c
239 *
240 *	Evaluate polynomial
241 *
242 *
243 *
244 * SYNOPSIS:
245 *
246 * int N;
247 * long double x, y, coef[N+1], polevl[];
248 *
249 * y = polevll( x, coef, N );
250 *
251 *
252 *
253 * DESCRIPTION:
254 *
255 * Evaluates polynomial of degree N:
256 *
257 *                     2          N
258 * y  =  C  + C x + C x  +...+ C x
259 *        0    1     2          N
260 *
261 * Coefficients are stored in reverse order:
262 *
263 * coef[0] = C  , ..., coef[N] = C  .
264 *            N                   0
265 *
266 *  The function p1evll() assumes that coef[N] = 1.0 and is
267 * omitted from the array.  Its calling arguments are
268 * otherwise the same as polevll().
269 *
270 *
271 * SPEED:
272 *
273 * In the interest of speed, there are no checks for out
274 * of bounds arithmetic.  This routine is used by most of
275 * the functions in the library.  Depending on available
276 * equipment features, the user may wish to rewrite the
277 * program in microcode or assembly language.
278 *
279 */
280
281/* Polynomial evaluator:
282 *  P[0] x^n  +  P[1] x^(n-1)  +  ...  +  P[n]
283 */
284static __inline__ long double polevll(long double x, const uLD *p, int n)
285{
286	register long double y;
287
288	y = p->ld;
289	p++;
290	do
291	{
292		y = y * x + p->ld;
293		p++;
294	}
295	while (--n);
296	return y;
297}
298
299
300
301/* Polynomial evaluator:
302 *  x^n  +  P[0] x^(n-1)  +  P[1] x^(n-2)  +  ...  +  P[n]
303 */
304static __inline__ long double p1evll(long double x, const uLD *p, int n)
305{
306	register long double y;
307
308	n -= 1;
309	y = x + p->ld;
310	p++;
311
312	do
313	{
314		y = y * x + p->ld;
315		p++;
316	}
317	while (--n);
318	return (y);
319}
320
321/* Float version */
322
323/*							polevlf.c
324 *							p1evlf.c
325 *
326 *	Evaluate polynomial
327 *
328 *
329 *
330 * SYNOPSIS:
331 *
332 * int N;
333 * float x, y, coef[N+1], polevlf[];
334 *
335 * y = polevlf( x, coef, N );
336 *
337 *
338 *
339 * DESCRIPTION:
340 *
341 * Evaluates polynomial of degree N:
342 *
343 *                     2          N
344 * y  =  C  + C x + C x  +...+ C x
345 *        0    1     2          N
346 *
347 * Coefficients are stored in reverse order:
348 *
349 * coef[0] = C  , ..., coef[N] = C  .
350 *            N                   0
351 *
352 *  The function p1evl() assumes that coef[N] = 1.0 and is
353 * omitted from the array.  Its calling arguments are
354 * otherwise the same as polevl().
355 *
356 *
357 * SPEED:
358 *
359 * In the interest of speed, there are no checks for out
360 * of bounds arithmetic.  This routine is used by most of
361 * the functions in the library.  Depending on available
362 * equipment features, the user may wish to rewrite the
363 * program in microcode or assembly language.
364 *
365 */
366
367/*
368Cephes Math Library Release 2.1:  December, 1988
369Copyright 1984, 1987, 1988 by Stephen L. Moshier
370Direct inquiries to 30 Frost Street, Cambridge, MA 02140
371*/
372
373static __inline__ float polevlf(float x, const float* coef, int N)
374{
375	float ans;
376	float *p;
377	int i;
378
379	p = (float*)coef;
380	ans = *p++;
381
382	/*
383	for (i = 0; i < N; i++)
384		ans = ans * x  +  *p++;
385	*/
386
387	i = N;
388	do
389		ans = ans * x  +  *p++;
390	while (--i);
391
392	return (ans);
393}
394
395/*							p1evl()	*/
396/*                                          N
397 * Evaluate polynomial when coefficient of x  is 1.0.
398 * Otherwise same as polevl.
399 */
400
401static __inline__ float p1evlf(float x, const float *coef, int N)
402{
403	float ans;
404	float *p;
405	int i;
406
407	p = (float*)coef;
408	ans = x + *p++;
409	i = N - 1;
410
411	do
412		ans = ans * x  + *p++;
413	while (--i);
414
415	return (ans);
416}
417