src/libm/s_tan.c
author Ryan C. Gordon <icculus@icculus.org>
Thu, 21 Apr 2016 03:16:44 -0400
changeset 11729 d1ce8396c356
parent 8842 f587255157cf
permissions -rw-r--r--
Initial shot at a renderer target for Apple's Metal API.

This isn't complete, but is enough to run testsprite2. It's currently
Mac-only; with a little work to figure out how to properly glue in a Metal
layer to a UIView, this will likely work on iOS, too.

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