cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

s_tan.c (1784B)


      1/*
      2 * ====================================================
      3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
      4 *
      5 * Developed at SunPro, a Sun Microsystems, Inc. business.
      6 * Permission to use, copy, modify, and distribute this
      7 * software is freely granted, provided that this notice
      8 * is preserved.
      9 * ====================================================
     10 */
     11
     12/* tan(x)
     13 * Return tangent function of x.
     14 *
     15 * kernel function:
     16 *	__kernel_tan		... tangent function on [-pi/4,pi/4]
     17 *	__ieee754_rem_pio2	... argument reduction routine
     18 *
     19 * Method.
     20 *      Let S,C and T denote the sin, cos and tan respectively on
     21 *	[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
     22 *	in [-pi/4 , +pi/4], and let n = k mod 4.
     23 *	We have
     24 *
     25 *          n        sin(x)      cos(x)        tan(x)
     26 *     ----------------------------------------------------------
     27 *	    0	       S	   C		 T
     28 *	    1	       C	  -S		-1/T
     29 *	    2	      -S	  -C		 T
     30 *	    3	      -C	   S		-1/T
     31 *     ----------------------------------------------------------
     32 *
     33 * Special cases:
     34 *      Let trig be any of sin, cos, or tan.
     35 *      trig(+-INF)  is NaN, with signals;
     36 *      trig(NaN)    is that NaN;
     37 *
     38 * Accuracy:
     39 *	TRIG(x) returns trig(x) nearly rounded
     40 */
     41
     42#include "math_libm.h"
     43#include "math_private.h"
     44
     45double tan(double x)
     46{
     47	double y[2],z=0.0;
     48	int32_t n, ix;
     49
     50    /* High word of x. */
     51	GET_HIGH_WORD(ix,x);
     52
     53    /* |x| ~< pi/4 */
     54	ix &= 0x7fffffff;
     55	if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1);
     56
     57    /* tan(Inf or NaN) is NaN */
     58	else if (ix>=0x7ff00000) return x-x;		/* NaN */
     59
     60    /* argument reduction needed */
     61	else {
     62	    n = __ieee754_rem_pio2(x,y);
     63	    return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /*   1 -- n even
     64							-1 -- n odd */
     65	}
     66}
     67libm_hidden_def(tan)