src/libm/k_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
/* @(#)k_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: k_sin.c,v 1.8 1995/05/10 20:46:31 jtc Exp $";
slouken@2756
    16
#endif
slouken@2756
    17
slouken@2756
    18
/* __kernel_sin( x, y, iy)
slouken@2756
    19
 * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
slouken@2756
    20
 * Input x is assumed to be bounded by ~pi/4 in magnitude.
slouken@2756
    21
 * Input y is the tail of x.
slouken@2756
    22
 * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
slouken@2756
    23
 *
slouken@2756
    24
 * Algorithm
slouken@2756
    25
 *	1. Since sin(-x) = -sin(x), we need only to consider positive x.
slouken@2756
    26
 *	2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
slouken@2756
    27
 *	3. sin(x) is approximated by a polynomial of degree 13 on
slouken@2756
    28
 *	   [0,pi/4]
slouken@2756
    29
 *		  	         3            13
slouken@2756
    30
 *	   	sin(x) ~ x + S1*x + ... + S6*x
slouken@2756
    31
 *	   where
slouken@2756
    32
 *
slouken@2756
    33
 * 	|sin(x)         2     4     6     8     10     12  |     -58
slouken@2756
    34
 * 	|----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x  +S6*x   )| <= 2
slouken@2756
    35
 * 	|  x 					           |
slouken@2756
    36
 *
slouken@2756
    37
 *	4. sin(x+y) = sin(x) + sin'(x')*y
slouken@2756
    38
 *		    ~ sin(x) + (1-x*x/2)*y
slouken@2756
    39
 *	   For better accuracy, let
slouken@2756
    40
 *		     3      2      2      2      2
slouken@2756
    41
 *		r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
slouken@2756
    42
 *	   then                   3    2
slouken@2756
    43
 *		sin(x) = x + (S1*x + (x *(r-y/2)+y))
slouken@2756
    44
 */
slouken@2756
    45
slouken@6044
    46
#include "math_libm.h"
slouken@2756
    47
#include "math_private.h"
slouken@2756
    48
slouken@2756
    49
#ifdef __STDC__
slouken@2756
    50
static const double
slouken@2756
    51
#else
slouken@2756
    52
static double
slouken@2756
    53
#endif
slouken@2756
    54
  half = 5.00000000000000000000e-01,    /* 0x3FE00000, 0x00000000 */
slouken@2756
    55
    S1 = -1.66666666666666324348e-01,   /* 0xBFC55555, 0x55555549 */
slouken@2756
    56
    S2 = 8.33333333332248946124e-03,    /* 0x3F811111, 0x1110F8A6 */
slouken@2756
    57
    S3 = -1.98412698298579493134e-04,   /* 0xBF2A01A0, 0x19C161D5 */
slouken@2756
    58
    S4 = 2.75573137070700676789e-06,    /* 0x3EC71DE3, 0x57B1FE7D */
slouken@2756
    59
    S5 = -2.50507602534068634195e-08,   /* 0xBE5AE5E6, 0x8A2B9CEB */
slouken@2756
    60
    S6 = 1.58969099521155010221e-10;    /* 0x3DE5D93A, 0x5ACFD57C */
slouken@2756
    61
slouken@2756
    62
#ifdef __STDC__
slouken@2756
    63
double attribute_hidden
slouken@2756
    64
__kernel_sin(double x, double y, int iy)
slouken@2756
    65
#else
slouken@2756
    66
double attribute_hidden
slouken@2756
    67
__kernel_sin(x, y, iy)
slouken@2756
    68
     double x, y;
slouken@2756
    69
     int iy;                    /* iy=0 if y is zero */
slouken@2756
    70
#endif
slouken@2756
    71
{
slouken@2756
    72
    double z, r, v;
slouken@2756
    73
    int32_t ix;
slouken@2756
    74
    GET_HIGH_WORD(ix, x);
slouken@2756
    75
    ix &= 0x7fffffff;           /* high word of x */
slouken@2756
    76
    if (ix < 0x3e400000) {      /* |x| < 2**-27 */
slouken@2756
    77
        if ((int) x == 0)
slouken@2756
    78
            return x;
slouken@2756
    79
    }                           /* generate inexact */
slouken@2756
    80
    z = x * x;
slouken@2756
    81
    v = z * x;
slouken@2756
    82
    r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6)));
slouken@2756
    83
    if (iy == 0)
slouken@2756
    84
        return x + v * (S1 + z * r);
slouken@2756
    85
    else
slouken@2756
    86
        return x - ((z * (half * y - v * r) - y) - v * S1);
slouken@2756
    87
}