src/libm/s_sin.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 22 Jun 2015 23:36:06 -0700
changeset 9776 952ff8a5076f
parent 6044 35448a5ea044
child 11683 48bcba563d9c
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.
     1 /* @(#)s_sin.c 5.1 93/09/24 */
     2 /*
     3  * ====================================================
     4  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
     5  *
     6  * Developed at SunPro, a Sun Microsystems, Inc. business.
     7  * Permission to use, copy, modify, and distribute this
     8  * software is freely granted, provided that this notice
     9  * is preserved.
    10  * ====================================================
    11  */
    12 
    13 #if defined(LIBM_SCCS) && !defined(lint)
    14 static const char rcsid[] =
    15     "$NetBSD: s_sin.c,v 1.7 1995/05/10 20:48:15 jtc Exp $";
    16 #endif
    17 
    18 /* sin(x)
    19  * Return sine function of x.
    20  *
    21  * kernel function:
    22  *	__kernel_sin		... sine function on [-pi/4,pi/4]
    23  *	__kernel_cos		... cose function on [-pi/4,pi/4]
    24  *	__ieee754_rem_pio2	... argument reduction routine
    25  *
    26  * Method.
    27  *      Let S,C and T denote the sin, cos and tan respectively on
    28  *	[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
    29  *	in [-pi/4 , +pi/4], and let n = k mod 4.
    30  *	We have
    31  *
    32  *          n        sin(x)      cos(x)        tan(x)
    33  *     ----------------------------------------------------------
    34  *	    0	       S	   C		 T
    35  *	    1	       C	  -S		-1/T
    36  *	    2	      -S	  -C		 T
    37  *	    3	      -C	   S		-1/T
    38  *     ----------------------------------------------------------
    39  *
    40  * Special cases:
    41  *      Let trig be any of sin, cos, or tan.
    42  *      trig(+-INF)  is NaN, with signals;
    43  *      trig(NaN)    is that NaN;
    44  *
    45  * Accuracy:
    46  *	TRIG(x) returns trig(x) nearly rounded
    47  */
    48 
    49 #include "math_libm.h"
    50 #include "math_private.h"
    51 
    52 libm_hidden_proto(sin)
    53 #ifdef __STDC__
    54      double sin(double x)
    55 #else
    56      double sin(x)
    57      double x;
    58 #endif
    59 {
    60     double y[2], z = 0.0;
    61     int32_t n, ix;
    62 
    63     /* High word of x. */
    64     GET_HIGH_WORD(ix, x);
    65 
    66     /* |x| ~< pi/4 */
    67     ix &= 0x7fffffff;
    68     if (ix <= 0x3fe921fb)
    69         return __kernel_sin(x, z, 0);
    70 
    71     /* sin(Inf or NaN) is NaN */
    72     else if (ix >= 0x7ff00000)
    73         return x - x;
    74 
    75     /* argument reduction needed */
    76     else {
    77         n = __ieee754_rem_pio2(x, y);
    78         switch (n & 3) {
    79         case 0:
    80             return __kernel_sin(y[0], y[1], 1);
    81         case 1:
    82             return __kernel_cos(y[0], y[1]);
    83         case 2:
    84             return -__kernel_sin(y[0], y[1], 1);
    85         default:
    86             return -__kernel_cos(y[0], y[1]);
    87         }
    88     }
    89 }
    90 
    91 libm_hidden_def(sin)