xref: /aosp_15_r20/external/musl/src/math/sincosl.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define _GNU_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include "libm.h"
3*c9945492SAndroid Build Coastguard Worker 
4*c9945492SAndroid Build Coastguard Worker #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
sincosl(long double x,long double * sin,long double * cos)5*c9945492SAndroid Build Coastguard Worker void sincosl(long double x, long double *sin, long double *cos)
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker 	double sind, cosd;
8*c9945492SAndroid Build Coastguard Worker 	sincos(x, &sind, &cosd);
9*c9945492SAndroid Build Coastguard Worker 	*sin = sind;
10*c9945492SAndroid Build Coastguard Worker 	*cos = cosd;
11*c9945492SAndroid Build Coastguard Worker }
12*c9945492SAndroid Build Coastguard Worker #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
sincosl(long double x,long double * sin,long double * cos)13*c9945492SAndroid Build Coastguard Worker void sincosl(long double x, long double *sin, long double *cos)
14*c9945492SAndroid Build Coastguard Worker {
15*c9945492SAndroid Build Coastguard Worker 	union ldshape u = {x};
16*c9945492SAndroid Build Coastguard Worker 	unsigned n;
17*c9945492SAndroid Build Coastguard Worker 	long double y[2], s, c;
18*c9945492SAndroid Build Coastguard Worker 
19*c9945492SAndroid Build Coastguard Worker 	u.i.se &= 0x7fff;
20*c9945492SAndroid Build Coastguard Worker 	if (u.i.se == 0x7fff) {
21*c9945492SAndroid Build Coastguard Worker 		*sin = *cos = x - x;
22*c9945492SAndroid Build Coastguard Worker 		return;
23*c9945492SAndroid Build Coastguard Worker 	}
24*c9945492SAndroid Build Coastguard Worker 	if (u.f < M_PI_4) {
25*c9945492SAndroid Build Coastguard Worker 		if (u.i.se < 0x3fff - LDBL_MANT_DIG) {
26*c9945492SAndroid Build Coastguard Worker 			/* raise underflow if subnormal */
27*c9945492SAndroid Build Coastguard Worker 			if (u.i.se == 0) FORCE_EVAL(x*0x1p-120f);
28*c9945492SAndroid Build Coastguard Worker 			*sin = x;
29*c9945492SAndroid Build Coastguard Worker 			/* raise inexact if x!=0 */
30*c9945492SAndroid Build Coastguard Worker 			*cos = 1.0 + x;
31*c9945492SAndroid Build Coastguard Worker 			return;
32*c9945492SAndroid Build Coastguard Worker 		}
33*c9945492SAndroid Build Coastguard Worker 		*sin = __sinl(x, 0, 0);
34*c9945492SAndroid Build Coastguard Worker 		*cos = __cosl(x, 0);
35*c9945492SAndroid Build Coastguard Worker 		return;
36*c9945492SAndroid Build Coastguard Worker 	}
37*c9945492SAndroid Build Coastguard Worker 	n = __rem_pio2l(x, y);
38*c9945492SAndroid Build Coastguard Worker 	s = __sinl(y[0], y[1], 1);
39*c9945492SAndroid Build Coastguard Worker 	c = __cosl(y[0], y[1]);
40*c9945492SAndroid Build Coastguard Worker 	switch (n & 3) {
41*c9945492SAndroid Build Coastguard Worker 	case 0:
42*c9945492SAndroid Build Coastguard Worker 		*sin = s;
43*c9945492SAndroid Build Coastguard Worker 		*cos = c;
44*c9945492SAndroid Build Coastguard Worker 		break;
45*c9945492SAndroid Build Coastguard Worker 	case 1:
46*c9945492SAndroid Build Coastguard Worker 		*sin = c;
47*c9945492SAndroid Build Coastguard Worker 		*cos = -s;
48*c9945492SAndroid Build Coastguard Worker 		break;
49*c9945492SAndroid Build Coastguard Worker 	case 2:
50*c9945492SAndroid Build Coastguard Worker 		*sin = -s;
51*c9945492SAndroid Build Coastguard Worker 		*cos = -c;
52*c9945492SAndroid Build Coastguard Worker 		break;
53*c9945492SAndroid Build Coastguard Worker 	case 3:
54*c9945492SAndroid Build Coastguard Worker 	default:
55*c9945492SAndroid Build Coastguard Worker 		*sin = -c;
56*c9945492SAndroid Build Coastguard Worker 		*cos = s;
57*c9945492SAndroid Build Coastguard Worker 		break;
58*c9945492SAndroid Build Coastguard Worker 	}
59*c9945492SAndroid Build Coastguard Worker }
60*c9945492SAndroid Build Coastguard Worker #endif
61