Mercurial > sdl-ios-xcode
annotate src/libm/k_sin.c @ 3409:c8f580ebc96a
Adam Strzelecki to SDL
Sending a patch for fullscreen Mac OS X SDL 1.3 (SVN) Cocoa mouse position handling. In fullscreen mouse coordinates should be relative to SCREEN not to the window, which doesn't really occupy fullscreen.
Without this patch mouse position (especially Y) was totally incorrect (shifted) in fullscreen.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 22 Oct 2009 04:46:11 +0000 |
parents | dc1eb82ffdaa |
children |
rev | line source |
---|---|
2756
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
1 /* @(#)k_sin.c 5.1 93/09/24 */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
2 /* |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
3 * ==================================================== |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
4 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
5 * |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
6 * Developed at SunPro, a Sun Microsystems, Inc. business. |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
7 * Permission to use, copy, modify, and distribute this |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
8 * software is freely granted, provided that this notice |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
9 * is preserved. |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
10 * ==================================================== |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
11 */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
12 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
13 #if defined(LIBM_SCCS) && !defined(lint) |
3162 | 14 static const char rcsid[] = |
15 "$NetBSD: k_sin.c,v 1.8 1995/05/10 20:46:31 jtc Exp $"; | |
2756
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
16 #endif |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
17 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
18 /* __kernel_sin( x, y, iy) |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
19 * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
20 * Input x is assumed to be bounded by ~pi/4 in magnitude. |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
21 * Input y is the tail of x. |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
22 * Input iy indicates whether y is 0. (if iy=0, y assume to be 0). |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
23 * |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
24 * Algorithm |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
25 * 1. Since sin(-x) = -sin(x), we need only to consider positive x. |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
26 * 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0. |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
27 * 3. sin(x) is approximated by a polynomial of degree 13 on |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
28 * [0,pi/4] |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
29 * 3 13 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
30 * sin(x) ~ x + S1*x + ... + S6*x |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
31 * where |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
32 * |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
33 * |sin(x) 2 4 6 8 10 12 | -58 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
34 * |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
35 * | x | |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
36 * |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
37 * 4. sin(x+y) = sin(x) + sin'(x')*y |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
38 * ~ sin(x) + (1-x*x/2)*y |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
39 * For better accuracy, let |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
40 * 3 2 2 2 2 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
41 * r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6)))) |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
42 * then 3 2 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
43 * sin(x) = x + (S1*x + (x *(r-y/2)+y)) |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
44 */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
45 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
46 #include "math.h" |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
47 #include "math_private.h" |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
48 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
49 #ifdef __STDC__ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
50 static const double |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
51 #else |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
52 static double |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
53 #endif |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
54 half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
55 S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
56 S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
57 S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
58 S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
59 S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
60 S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
61 |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
62 #ifdef __STDC__ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
63 double attribute_hidden |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
64 __kernel_sin(double x, double y, int iy) |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
65 #else |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
66 double attribute_hidden |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
67 __kernel_sin(x, y, iy) |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
68 double x, y; |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
69 int iy; /* iy=0 if y is zero */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
70 #endif |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
71 { |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
72 double z, r, v; |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
73 int32_t ix; |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
74 GET_HIGH_WORD(ix, x); |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
75 ix &= 0x7fffffff; /* high word of x */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
76 if (ix < 0x3e400000) { /* |x| < 2**-27 */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
77 if ((int) x == 0) |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
78 return x; |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
79 } /* generate inexact */ |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
80 z = x * x; |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
81 v = z * x; |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
82 r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6))); |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
83 if (iy == 0) |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
84 return x + v * (S1 + z * r); |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
85 else |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
86 return x - ((z * (half * y - v * r) - y) - v * S1); |
a98604b691c8
Expanded the libm support and put it into a separate directory.
Sam Lantinga <slouken@libsdl.org>
parents:
diff
changeset
|
87 } |