/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c *//** ====================================================* 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.* ====================================================*//* sin(x)* Return sine function of x.** kernel function:* __sin ... sine function on [-pi/4,pi/4]* __cos ... cose function on [-pi/4,pi/4]* __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 "libm.h"double sin(double x){double y[2];uint32_t ix;unsigned n;/* High word of x. */GET_HIGH_WORD(ix, x);ix &= 0x7fffffff;/* |x| ~< pi/4 */if (ix <= 0x3fe921fb) {if (ix < 0x3e500000) { /* |x| < 2**-26 *//* raise inexact if x != 0 and underflow if subnormal*/FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);return x;}return __sin(x, 0.0, 0);}/* sin(Inf or NaN) is NaN */if (ix >= 0x7ff00000)return x - x;/* argument reduction needed */n = __rem_pio2(x, y);switch (n&3) {case 0: return __sin(y[0], y[1], 1);case 1: return __cos(y[0], y[1]);case 2: return -__sin(y[0], y[1], 1);default:return -__cos(y[0], y[1]);}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。