github.com/afumu/libc@v0.0.6/musl/src/math/__polevll.c (about)

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