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