src/libm/s_tan.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 22 Jun 2015 23:36:06 -0700
changeset 9776 952ff8a5076f
parent 8842 f587255157cf
permissions -rw-r--r--
Fixed bug 3030 - SDL_RecreateWindow fails to restore title, icon, etc.

Adam M.

It loses the title and icon when window recreation fails. For instance, this may happen when trying to create an OpenGL ES window on a system that doesn't support it. But at that point, the title and icon have already been lost.
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)