version 1.9, 1997/10/09 11:30:24 |
version 1.10, 1999/07/02 15:37:41 |
|
|
* |
* |
* Developed at SunPro, a Sun Microsystems, Inc. business. |
* Developed at SunPro, a Sun Microsystems, Inc. business. |
* Permission to use, copy, modify, and distribute this |
* Permission to use, copy, modify, and distribute this |
* software is freely granted, provided that this notice |
* software is freely granted, provided that this notice |
* is preserved. |
* is preserved. |
* ==================================================== |
* ==================================================== |
*/ |
*/ |
Line 19 __RCSID("$NetBSD$"); |
|
Line 19 __RCSID("$NetBSD$"); |
|
* kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854 |
* kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854 |
* Input x is assumed to be bounded by ~pi/4 in magnitude. |
* Input x is assumed to be bounded by ~pi/4 in magnitude. |
* Input y is the tail of x. |
* Input y is the tail of x. |
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0). |
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0). |
* |
* |
* Algorithm |
* Algorithm |
* 1. Since sin(-x) = -sin(x), we need only to consider positive x. |
* 1. Since sin(-x) = -sin(x), we need only to consider positive x. |
* 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0. |
* 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0. |
* 3. sin(x) is approximated by a polynomial of degree 13 on |
* 3. sin(x) is approximated by a polynomial of degree 13 on |
* [0,pi/4] |
* [0,pi/4] |
* 3 13 |
* 3 13 |
* sin(x) ~ x + S1*x + ... + S6*x |
* sin(x) ~ x + S1*x + ... + S6*x |
* where |
* where |
* |
* |
* |sin(x) 2 4 6 8 10 12 | -58 |
* |sin(x) 2 4 6 8 10 12 | -58 |
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2 |
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2 |
* | x | |
* | x | |
* |
* |
* 4. sin(x+y) = sin(x) + sin'(x')*y |
* 4. sin(x+y) = sin(x) + sin'(x')*y |
* ~ sin(x) + (1-x*x/2)*y |
* ~ sin(x) + (1-x*x/2)*y |
* For better accuracy, let |
* For better accuracy, let |
* 3 2 2 2 2 |
* 3 2 2 2 2 |
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6)))) |
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6)))) |
* then 3 2 |
* then 3 2 |
Line 47 __RCSID("$NetBSD$"); |
|
Line 47 __RCSID("$NetBSD$"); |
|
#include "math_private.h" |
#include "math_private.h" |
|
|
#ifdef __STDC__ |
#ifdef __STDC__ |
static const double |
static const double |
#else |
#else |
static double |
static double |
#endif |
#endif |
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ |
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ |
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */ |
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */ |