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