cos.c\math\src - musl - musl - an implementation of the standard library for Linux-based systems

index : musl
musl - an implementation of the standard library for Linux-based systems
summary refs log tree commit diff
path: root/src/math/cos.c
blob: ee97f68bbb7be73e473e9324484bed533fcb39bb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* origin: FreeBSD /usr/src/lib/msun/src/s_cos.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.
 * ====================================================
 */
/* cos(x)
 * Return cosine function of x.
 *
 * kernel function:
 * __sin ... sine function on [-pi/4,pi/4]
 * __cos ... cosine 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 cos(double x)
{
	double y[2];
	uint32_t ix;
	unsigned n;
	GET_HIGH_WORD(ix, x);
	ix &= 0x7fffffff;
	/* |x| ~< pi/4 */
	if (ix <= 0x3fe921fb) {
		if (ix < 0x3e46a09e) { /* |x| < 2**-27 * sqrt(2) */
			/* raise inexact if x!=0 */
			FORCE_EVAL(x + 0x1p120f);
			return 1.0;
		}
		return __cos(x, 0);
	}
	/* cos(Inf or NaN) is NaN */
	if (ix >= 0x7ff00000)
		return x-x;
	/* argument reduction */
	n = __rem_pio2(x, y);
	switch (n&3) {
	case 0: return __cos(y[0], y[1]);
	case 1: return -__sin(y[0], y[1], 1);
	case 2: return -__cos(y[0], y[1]);
	default:
		return __sin(y[0], y[1], 1);
	}
}
generated by cgit v1.2.1 (git 2.18.0) at 2025年10月01日 19:56:48 +0000

AltStyle によって変換されたページ (->オリジナル) /