s_sin.c
Go to the documentation of this file.
/* @(#)s_sin.c 5.1 93/09/24 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static const char rcsid[] =
"$NetBSD: s_sin.c,v 1.7 1995/05/10 20:48:15 jtc Exp $";
#endif
/* sin(x)
* Return sine function of x.
*
* kernel function:
* __kernel_sin ... sine function on [-pi/4,pi/4]
* __kernel_cos ... cose function on [-pi/4,pi/4]
* __ieee754_rem_pio2 ... argument reduction routine
*
* Method.
* Let S,C and T denote the sin, cos and tan respectively on
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
* in [-pi/4 , +pi/4], and let n = k mod 4.
* We have
*
* n sin(x) cos(x) tan(x)
* ----------------------------------------------------------
* 0 S C T
* 1 C -S -1/T
* 2 -S -C T
* 3 -C S -1/T
* ----------------------------------------------------------
*
* Special cases:
* Let trig be any of sin, cos, or tan.
* trig(+-INF) is NaN, with signals;
* trig(NaN) is that NaN;
*
* Accuracy:
* TRIG(x) returns trig(x) nearly rounded
*/
#include "math_libm.h"
#include "math_private.h"
libm_hidden_proto(sin)
#ifdef __STDC__
double sin(double x)
#else
double sin(x)
double x;
#endif
{
double y[2], z = 0.0;
int32_t n, ix;
/* High word of x. */
GET_HIGH_WORD(ix, x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if (ix <= 0x3fe921fb)
return __kernel_sin(x, z, 0);
/* sin(Inf or NaN) is NaN */
else if (ix >= 0x7ff00000)
return x - x;
/* argument reduction needed */
else {
n = __ieee754_rem_pio2(x, y);
switch (n & 3) {
case 0:
return __kernel_sin(y[0], y[1], 1);
case 1:
return __kernel_cos(y[0], y[1]);
case 2:
return -__kernel_sin(y[0], y[1], 1);
default:
return -__kernel_cos(y[0], y[1]);
}
}
}
libm_hidden_def(sin)
__ieee754_rem_pio2
int32_t attribute_hidden __ieee754_rem_pio2(double x, y)
Definition: e_rem_pio2.c:94
GET_HIGH_WORD
#define GET_HIGH_WORD(i, d)
Definition: math_private.h:103
n
GLdouble n
Definition: SDL_opengl_glext.h:1952
int32_t
signed int int32_t
Definition: SDL_config_windows.h:61
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1567
libm_hidden_proto
libm_hidden_proto(sin)
Definition: s_sin.c:52
sin
#define sin
Definition: math_private.h:41
libm_hidden_def
#define libm_hidden_def(x)
Definition: math_private.h:26
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1567
math_libm.h
__kernel_sin
double attribute_hidden __kernel_sin(double x, double y, int iy)
Definition: k_sin.c:67
z
GLdouble GLdouble z
Definition: SDL_opengl_glext.h:404
math_private.h
__kernel_cos
double attribute_hidden __kernel_cos(double x, double y)
Definition: k_cos.c:74