xref: /aosp_15_r20/external/musl/src/math/__polevll.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker /* origin: OpenBSD /usr/src/lib/libm/src/polevll.c */
2*c9945492SAndroid Build Coastguard Worker /*
3*c9945492SAndroid Build Coastguard Worker  * Copyright (c) 2008 Stephen L. Moshier <[email protected]>
4*c9945492SAndroid Build Coastguard Worker  *
5*c9945492SAndroid Build Coastguard Worker  * Permission to use, copy, modify, and distribute this software for any
6*c9945492SAndroid Build Coastguard Worker  * purpose with or without fee is hereby granted, provided that the above
7*c9945492SAndroid Build Coastguard Worker  * copyright notice and this permission notice appear in all copies.
8*c9945492SAndroid Build Coastguard Worker  *
9*c9945492SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*c9945492SAndroid Build Coastguard Worker  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*c9945492SAndroid Build Coastguard Worker  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*c9945492SAndroid Build Coastguard Worker  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*c9945492SAndroid Build Coastguard Worker  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*c9945492SAndroid Build Coastguard Worker  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*c9945492SAndroid Build Coastguard Worker  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*c9945492SAndroid Build Coastguard Worker  */
17*c9945492SAndroid Build Coastguard Worker /*
18*c9945492SAndroid Build Coastguard Worker  *      Evaluate polynomial
19*c9945492SAndroid Build Coastguard Worker  *
20*c9945492SAndroid Build Coastguard Worker  *
21*c9945492SAndroid Build Coastguard Worker  * SYNOPSIS:
22*c9945492SAndroid Build Coastguard Worker  *
23*c9945492SAndroid Build Coastguard Worker  * int N;
24*c9945492SAndroid Build Coastguard Worker  * long double x, y, coef[N+1], polevl[];
25*c9945492SAndroid Build Coastguard Worker  *
26*c9945492SAndroid Build Coastguard Worker  * y = polevll( x, coef, N );
27*c9945492SAndroid Build Coastguard Worker  *
28*c9945492SAndroid Build Coastguard Worker  *
29*c9945492SAndroid Build Coastguard Worker  * DESCRIPTION:
30*c9945492SAndroid Build Coastguard Worker  *
31*c9945492SAndroid Build Coastguard Worker  * Evaluates polynomial of degree N:
32*c9945492SAndroid Build Coastguard Worker  *
33*c9945492SAndroid Build Coastguard Worker  *                     2          N
34*c9945492SAndroid Build Coastguard Worker  * y  =  C  + C x + C x  +...+ C x
35*c9945492SAndroid Build Coastguard Worker  *        0    1     2          N
36*c9945492SAndroid Build Coastguard Worker  *
37*c9945492SAndroid Build Coastguard Worker  * Coefficients are stored in reverse order:
38*c9945492SAndroid Build Coastguard Worker  *
39*c9945492SAndroid Build Coastguard Worker  * coef[0] = C  , ..., coef[N] = C  .
40*c9945492SAndroid Build Coastguard Worker  *            N                   0
41*c9945492SAndroid Build Coastguard Worker  *
42*c9945492SAndroid Build Coastguard Worker  *  The function p1evll() assumes that coef[N] = 1.0 and is
43*c9945492SAndroid Build Coastguard Worker  * omitted from the array.  Its calling arguments are
44*c9945492SAndroid Build Coastguard Worker  * otherwise the same as polevll().
45*c9945492SAndroid Build Coastguard Worker  *
46*c9945492SAndroid Build Coastguard Worker  *
47*c9945492SAndroid Build Coastguard Worker  * SPEED:
48*c9945492SAndroid Build Coastguard Worker  *
49*c9945492SAndroid Build Coastguard Worker  * In the interest of speed, there are no checks for out
50*c9945492SAndroid Build Coastguard Worker  * of bounds arithmetic.  This routine is used by most of
51*c9945492SAndroid Build Coastguard Worker  * the functions in the library.  Depending on available
52*c9945492SAndroid Build Coastguard Worker  * equipment features, the user may wish to rewrite the
53*c9945492SAndroid Build Coastguard Worker  * program in microcode or assembly language.
54*c9945492SAndroid Build Coastguard Worker  *
55*c9945492SAndroid Build Coastguard Worker  */
56*c9945492SAndroid Build Coastguard Worker 
57*c9945492SAndroid Build Coastguard Worker #include "libm.h"
58*c9945492SAndroid Build Coastguard Worker 
59*c9945492SAndroid Build Coastguard Worker #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
60*c9945492SAndroid Build Coastguard Worker #else
61*c9945492SAndroid Build Coastguard Worker /*
62*c9945492SAndroid Build Coastguard Worker  * Polynomial evaluator:
63*c9945492SAndroid Build Coastguard Worker  *  P[0] x^n  +  P[1] x^(n-1)  +  ...  +  P[n]
64*c9945492SAndroid Build Coastguard Worker  */
__polevll(long double x,const long double * P,int n)65*c9945492SAndroid Build Coastguard Worker long double __polevll(long double x, const long double *P, int n)
66*c9945492SAndroid Build Coastguard Worker {
67*c9945492SAndroid Build Coastguard Worker 	long double y;
68*c9945492SAndroid Build Coastguard Worker 
69*c9945492SAndroid Build Coastguard Worker 	y = *P++;
70*c9945492SAndroid Build Coastguard Worker 	do {
71*c9945492SAndroid Build Coastguard Worker 		y = y * x + *P++;
72*c9945492SAndroid Build Coastguard Worker 	} while (--n);
73*c9945492SAndroid Build Coastguard Worker 
74*c9945492SAndroid Build Coastguard Worker 	return y;
75*c9945492SAndroid Build Coastguard Worker }
76*c9945492SAndroid Build Coastguard Worker 
77*c9945492SAndroid Build Coastguard Worker /*
78*c9945492SAndroid Build Coastguard Worker  * Polynomial evaluator:
79*c9945492SAndroid Build Coastguard Worker  *  x^n  +  P[0] x^(n-1)  +  P[1] x^(n-2)  +  ...  +  P[n]
80*c9945492SAndroid Build Coastguard Worker  */
__p1evll(long double x,const long double * P,int n)81*c9945492SAndroid Build Coastguard Worker long double __p1evll(long double x, const long double *P, int n)
82*c9945492SAndroid Build Coastguard Worker {
83*c9945492SAndroid Build Coastguard Worker 	long double y;
84*c9945492SAndroid Build Coastguard Worker 
85*c9945492SAndroid Build Coastguard Worker 	n -= 1;
86*c9945492SAndroid Build Coastguard Worker 	y = x + *P++;
87*c9945492SAndroid Build Coastguard Worker 	do {
88*c9945492SAndroid Build Coastguard Worker 		y = y * x + *P++;
89*c9945492SAndroid Build Coastguard Worker 	} while (--n);
90*c9945492SAndroid Build Coastguard Worker 
91*c9945492SAndroid Build Coastguard Worker 	return y;
92*c9945492SAndroid Build Coastguard Worker }
93*c9945492SAndroid Build Coastguard Worker #endif
94