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_tan.c | 104 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 newlib/libm/mathfp/sf_tan.c (limited to 'newlib/libm/mathfp/sf_tan.c') diff --git a/newlib/libm/mathfp/sf_tan.c b/newlib/libm/mathfp/sf_tan.c new file mode 100644 index 0000000..fcde19a --- /dev/null +++ b/newlib/libm/mathfp/sf_tan.c @@ -0,0 +1,104 @@ + +/* @(#)z_tanf.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. + ******************************************************************/ +/****************************************************************** + * Tangent + * + * Input: + * x - floating point value + * + * Output: + * tangent of x + * + * Description: + * This routine calculates the tangent of x. + * + *****************************************************************/ + +#include "fdlibm.h" +#include "zmath.h" + +static const float TWO_OVER_PI = 0.6366197723; +static const float p[] = { -0.958017723e-1 }; +static const float q[] = { -0.429135777, + 0.971685835e-2 }; + +float +_DEFUN (tanf, (float), + float x) +{ + float y, f, g, XN, xnum, xden, res; + int N; + + /* Check for special values. */ + switch (numtestf (x)) + { + case NAN: + errno = EDOM; + return (x); + case INF: + errno = EDOM; + return (z_notanum_f.f); + } + + y = fabsf (x); + + /* Check for values that are out of our range. */ + if (y > 105414357.0) + { + errno = ERANGE; + return (y); + } + + if (x < 0.0) + N = (int) (x * TWO_OVER_PI - 0.5); + else + N = (int) (x * TWO_OVER_PI + 0.5); + + XN = (float) N; + + f = x - N * __PI_OVER_TWO; + + /* Check for values that are too small. */ + if (-z_rooteps_f < f && f < z_rooteps_f) + { + xnum = f; + xden = 1.0; + } + + /* Calculate the polynomial. */ + else + { + g = f * f; + + xnum = f * (p[0] * g) + f; + xden = (q[1] * g + q[0]) * g + 1.0; + } + + /* Check for odd or even values. */ + if (N & 1) + { + xnum = -xnum; + res = xden / xnum; + } + else + { + res = xnum / xden; + } + + return (res); +} + +#ifdef _DOUBLE_IS_32BITS + +double tan (double x) +{ + return (double) tanf ((float) x); +} + +#endif /* _DOUBLE_IS_32BITS */ -- cgit v1.2.3