From f95a4a932476be2ba99e2fd081e8d2bc6ea12813 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 15 Dec 2017 09:38:53 -0500 Subject: Import newlib and create makefile --- newlib/libm/mathfp/sf_sine.c | 112 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 newlib/libm/mathfp/sf_sine.c (limited to 'newlib/libm/mathfp/sf_sine.c') diff --git a/newlib/libm/mathfp/sf_sine.c b/newlib/libm/mathfp/sf_sine.c new file mode 100644 index 0000000..6932de2 --- /dev/null +++ b/newlib/libm/mathfp/sf_sine.c @@ -0,0 +1,112 @@ + +/* @(#)z_sinef.c 1.0 98/08/13 */ +/****************************************************************** + * The following routines are coded directly from the algorithms + * and coefficients given in "Software Manual for the Elementary + * Functions" by William J. Cody, Jr. and William Waite, Prentice + * Hall, 1980. + ******************************************************************/ +/****************************************************************** + * sine generator + * + * Input: + * x - floating point value + * cosine - indicates cosine value + * + * Output: + * Sine of x. + * + * Description: + * This routine calculates sines and cosines. + * + *****************************************************************/ + +#include "fdlibm.h" +#include "zmath.h" + +static const float HALF_PI = 1.570796326; +static const float ONE_OVER_PI = 0.318309886; +static const float r[] = { -0.1666665668, + 0.8333025139e-02, + -0.1980741872e-03, + 0.2601903036e-5 }; + +float +_DEFUN (sinef, (float, int), + float x _AND + int cosine) +{ + int sgn, N; + float y, XN, g, R, res; + float YMAX = 210828714.0; + + switch (numtestf (x)) + { + case NAN: + errno = EDOM; + return (x); + case INF: + errno = EDOM; + return (z_notanum_f.f); + } + + /* Use sin and cos properties to ease computations. */ + if (cosine) + { + sgn = 1; + y = fabsf (x) + HALF_PI; + } + else + { + if (x < 0.0) + { + sgn = -1; + y = -x; + } + else + { + sgn = 1; + y = x; + } + } + + /* Check for values of y that will overflow here. */ + if (y > YMAX) + { + errno = ERANGE; + return (x); + } + + /* Calculate the exponent. */ + if (y < 0.0) + N = (int) (y * ONE_OVER_PI - 0.5); + else + N = (int) (y * ONE_OVER_PI + 0.5); + XN = (float) N; + + if (N & 1) + sgn = -sgn; + + if (cosine) + XN -= 0.5; + + y = fabsf (x) - XN * __PI; + + if (-z_rooteps_f < y && y < z_rooteps_f) + res = y; + + else + { + g = y * y; + + /* Calculate the Taylor series. */ + R = (((r[3] * g + r[2]) * g + r[1]) * g + r[0]) * g; + + /* Finally, compute the result. */ + res = y + y * R; + } + + res *= sgn; + + return (res); +} -- cgit v1.2.3