Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 75 lines (69 sloc) 2.427 kb
b07e1d9 auto import from //depot/cupcake/@135843
The Android Open Source Project authored
1
2 /* @(#)k_sin.c 1.3 95/01/18 */
3 /*
4 * ====================================================
5 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6 *
7 * Developed at SunSoft, a Sun Microsystems, Inc. business.
8 * Permission to use, copy, modify, and distribute this
9 * software is freely granted, provided that this notice
10 * is preserved.
11 * ====================================================
12 */
13
14 /* __kernel_sin( x, y, iy)
15 * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
16 * Input x is assumed to be bounded by ~pi/4 in magnitude.
17 * Input y is the tail of x.
18 * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
19 *
20 * Algorithm
21 * 1. Since ieee_sin(-x) = -ieee_sin(x), we need only to consider positive x.
22 * 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
23 * 3. ieee_sin(x) is approximated by a polynomial of degree 13 on
24 * [0,pi/4]
25 * 3 13
26 * sin(x) ~ x + S1*x + ... + S6*x
27 * where
28 *
29 * |ieee_sin(x) 2 4 6 8 10 12 | -58
30 * |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
31 * | x |
32 *
33 * 4. ieee_sin(x+y) = ieee_sin(x) + sin'(x')*y
34 * ~ ieee_sin(x) + (1-x*x/2)*y
35 * For better accuracy, let
36 * 3 2 2 2 2
37 * r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
38 * then 3 2
39 * sin(x) = x + (S1*x + (x *(r-y/2)+y))
40 */
41
42 #include "fdlibm.h"
43
44 #ifdef __STDC__
45 static const double
46 #else
47 static double
48 #endif
49 half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
50 S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
51 S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
52 S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
53 S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
54 S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
55 S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
56
57 #ifdef __STDC__
58 double __kernel_sin(double x, double y, int iy)
59 #else
60 double __kernel_sin(x, y, iy)
61 double x,y; int iy; /* iy=0 if y is zero */
62 #endif
63 {
64 double z,r,v;
65 int ix;
66 ix = __HI(x)&0x7fffffff; /* high word of x */
67 if(ix<0x3e400000) /* |x| < 2**-27 */
68 {if((int)x==0) return x;} /* generate inexact */
69 z = x*x;
70 v = z*x;
71 r = S2+z*(S3+z*(S4+z*(S5+z*S6)));
72 if(iy==0) return x+v*(S1+z*r);
73 else return x-((z*(half*y-v*r)-y)-v*S1);
74 }
Something went wrong with that request. Please try again.