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