xref: /aosp_15_r20/external/musl/src/math/scalbnl.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
3*c9945492SAndroid Build Coastguard Worker #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
scalbnl(long double x,int n)4*c9945492SAndroid Build Coastguard Worker long double scalbnl(long double x, int n)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker 	return scalbn(x, n);
7*c9945492SAndroid Build Coastguard Worker }
8*c9945492SAndroid Build Coastguard Worker #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
scalbnl(long double x,int n)9*c9945492SAndroid Build Coastguard Worker long double scalbnl(long double x, int n)
10*c9945492SAndroid Build Coastguard Worker {
11*c9945492SAndroid Build Coastguard Worker 	union ldshape u;
12*c9945492SAndroid Build Coastguard Worker 
13*c9945492SAndroid Build Coastguard Worker 	if (n > 16383) {
14*c9945492SAndroid Build Coastguard Worker 		x *= 0x1p16383L;
15*c9945492SAndroid Build Coastguard Worker 		n -= 16383;
16*c9945492SAndroid Build Coastguard Worker 		if (n > 16383) {
17*c9945492SAndroid Build Coastguard Worker 			x *= 0x1p16383L;
18*c9945492SAndroid Build Coastguard Worker 			n -= 16383;
19*c9945492SAndroid Build Coastguard Worker 			if (n > 16383)
20*c9945492SAndroid Build Coastguard Worker 				n = 16383;
21*c9945492SAndroid Build Coastguard Worker 		}
22*c9945492SAndroid Build Coastguard Worker 	} else if (n < -16382) {
23*c9945492SAndroid Build Coastguard Worker 		x *= 0x1p-16382L * 0x1p113L;
24*c9945492SAndroid Build Coastguard Worker 		n += 16382 - 113;
25*c9945492SAndroid Build Coastguard Worker 		if (n < -16382) {
26*c9945492SAndroid Build Coastguard Worker 			x *= 0x1p-16382L * 0x1p113L;
27*c9945492SAndroid Build Coastguard Worker 			n += 16382 - 113;
28*c9945492SAndroid Build Coastguard Worker 			if (n < -16382)
29*c9945492SAndroid Build Coastguard Worker 				n = -16382;
30*c9945492SAndroid Build Coastguard Worker 		}
31*c9945492SAndroid Build Coastguard Worker 	}
32*c9945492SAndroid Build Coastguard Worker 	u.f = 1.0;
33*c9945492SAndroid Build Coastguard Worker 	u.i.se = 0x3fff + n;
34*c9945492SAndroid Build Coastguard Worker 	return x * u.f;
35*c9945492SAndroid Build Coastguard Worker }
36*c9945492SAndroid Build Coastguard Worker #endif
37