35#pragma warning(disable : 4723)
54#define EXTRACT_WORDS(ix0, ix1, d) \
56 uint64_t bits = base::bit_cast<uint64_t>(d); \
58 (ix1) = bits & 0xFFFFFFFFu; \
63#define GET_HIGH_WORD(i, d) \
65 uint64_t bits = base::bit_cast<uint64_t>(d); \
71#define GET_LOW_WORD(i, d) \
73 uint64_t bits = base::bit_cast<uint64_t>(d); \
74 (i) = bits & 0xFFFFFFFFu; \
79#define INSERT_WORDS(d, ix0, ix1) \
82 bits |= static_cast<uint64_t>(ix0) << 32; \
83 bits |= static_cast<uint32_t>(ix1); \
84 (d) = base::bit_cast<double>(bits); \
89#define SET_HIGH_WORD(d, v) \
91 uint64_t bits = base::bit_cast<uint64_t>(d); \
92 bits &= 0x0000'0000'FFFF'FFFF; \
93 bits |= static_cast<uint64_t>(v) << 32; \
94 (d) = base::bit_cast<double>(bits); \
99#define SET_LOW_WORD(d, v) \
101 uint64_t bits = base::bit_cast<uint64_t>(d); \
102 bits &= 0xFFFF'FFFF'0000'0000; \
103 bits |= static_cast<uint32_t>(v); \
104 (d) = base::bit_cast<double>(bits); \
108int __kernel_rem_pio2(
double*
x,
double*
y,
int e0,
int nx,
int prec,
118int32_t __ieee754_rem_pio2(
double x,
double *
y) {
122 static const int32_t two_over_pi[] = {
123 0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, 0x95993C,
124 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A, 0x424DD2, 0xE00649,
125 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, 0xA73EE8, 0x8235F5, 0x2EBB44,
126 0x84E99C, 0x7026B4, 0x5F7E41, 0x3991D6, 0x398353, 0x39F49C, 0x845F8B,
127 0xBDF928, 0x3B1FF8, 0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D,
128 0x367ECF, 0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
129 0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08, 0x560330,
130 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3, 0x91615E, 0xE61B08,
131 0x659985, 0x5F14A0, 0x68408D, 0xFFD880, 0x4D7327, 0x310606, 0x1556CA,
132 0x73A8C9, 0x60E27B, 0xC08C6B,
135 static const int32_t npio2_hw[] = {
136 0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C,
137 0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C,
138 0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A,
139 0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C,
140 0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB,
141 0x404858EB, 0x404921FB,
155 zero = 0.00000000000000000000e+00,
156 half = 5.00000000000000000000e-01,
157 two24 = 1.67772160000000000000e+07,
158 invpio2 = 6.36619772367581382433e-01,
159 pio2_1 = 1.57079632673412561417e+00,
160 pio2_1t = 6.07710050650619224932e-11,
161 pio2_2 = 6.07710050630396597660e-11,
162 pio2_2t = 2.02226624879595063154e-21,
163 pio2_3 = 2.02226624871116645580e-21,
164 pio2_3t = 8.47842766036889956997e-32;
166 double z, w, t,
r,
fn;
168 int32_t e0,
i, j, nx,
n, ix, hx;
173 ix = hx & 0x7FFFFFFF;
174 if (ix <= 0x3FE921FB) {
179 if (ix < 0x4002D97C) {
182 if (ix != 0x3FF921FB) {
184 y[1] = (
z -
y[0]) - pio2_1t;
188 y[1] = (
z -
y[0]) - pio2_2t;
193 if (ix != 0x3FF921FB) {
195 y[1] = (
z -
y[0]) + pio2_1t;
199 y[1] = (
z -
y[0]) + pio2_2t;
204 if (ix <= 0x413921FB) {
206 n =
static_cast<int32_t
>(t * invpio2 + half);
207 fn =
static_cast<double>(
n);
210 if (n < 32 && ix != npio2_hw[n - 1]) {
217 i = j - ((high >> 20) & 0x7FF);
222 w =
fn * pio2_2t - ((t -
r) - w);
225 i = j - ((high >> 20) & 0x7FF);
230 w =
fn * pio2_3t - ((t -
r) - w);
235 y[1] = (
r -
y[0]) - w;
247 if (ix >= 0x7FF00000) {
253 SET_LOW_WORD(
z, low);
254 e0 = (ix >> 20) - 1046;
255 SET_HIGH_WORD(
z, ix -
static_cast<int32_t
>(
static_cast<uint32_t
>(e0) << 20));
256 for (
i = 0;
i < 2;
i++) {
257 tx[
i] =
static_cast<double>(
static_cast<int32_t
>(
z));
258 z = (
z - tx[
i]) * two24;
262 while (tx[nx - 1] == zero) nx--;
263 n = __kernel_rem_pio2(tx,
y, e0, nx, 2, two_over_pi);
307 one = 1.00000000000000000000e+00,
308 C1 = 4.16666666666666019037e-02,
309 C2 = -1.38888888888741095749e-03,
310 C3 = 2.48015872894767294178e-05,
311 C4 = -2.75573143513906633035e-07,
312 C5 = 2.08757232129817482790e-09,
313 C6 = -1.13596475577881948265e-11;
315 double a, iz,
z,
r, qx;
319 if (ix < 0x3E400000) {
320 if (
static_cast<int>(
x) == 0)
return one;
323 r =
z * (
C1 +
z * (
C2 +
z * (C3 +
z * (C4 +
z * (C5 +
z * C6)))));
324 if (ix < 0x3FD33333) {
325 return one - (0.5 *
z - (
z *
r -
x *
y));
327 if (ix > 0x3FE90000) {
334 return a - (iz - (
z *
r -
x *
y));
443int __kernel_rem_pio2(
double *
x,
double *
y,
int e0,
int nx,
int prec,
444 const int32_t *ipio2) {
451 static const int init_jk[] = {2, 3, 4, 6};
453 static const double PIo2[] = {
454 1.57079625129699707031e+00,
455 7.54978941586159635335e-08,
456 5.39030252995776476554e-15,
457 3.28200341580791294123e-22,
458 1.27065575308067607349e-29,
459 1.22933308981111328932e-36,
460 2.73370053816464559624e-44,
461 2.16741683877804819444e-51,
467 two24 = 1.67772160000000000000e+07,
468 twon24 = 5.96046447753906250000e-08;
470 int32_t jz, jx, jv, jp, jk,
carry,
n, iq[20],
i, j, k,
m, q0, ih;
471 double z, fw, f[20], fq[20], q[20];
481 q0 = e0 - 24 * (jv + 1);
486 for (
i = 0;
i <=
m;
i++, j++) {
487 f[
i] = (j < 0) ? zero : static_cast<double>(ipio2[j]);
491 for (
i = 0;
i <= jk;
i++) {
492 for (j = 0, fw = 0.0; j <= jx; j++) fw +=
x[j] * f[jx +
i - j];
499 for (
i = 0, j = jz,
z = q[jz]; j > 0;
i++, j--) {
500 fw =
static_cast<double>(
static_cast<int32_t>(twon24 *
z));
501 iq[
i] =
static_cast<int32_t>(
z - two24 * fw);
507 z -= 8.0 * floor(
z * 0.125);
509 z -=
static_cast<double>(
n);
512 i = (iq[jz - 1] >> (24 - q0));
514 iq[jz - 1] -=
i << (24 - q0);
515 ih = iq[jz - 1] >> (23 - q0);
516 }
else if (q0 == 0) {
517 ih = iq[jz - 1] >> 23;
518 }
else if (
z >= 0.5) {
525 for (
i = 0;
i < jz;
i++) {
530 iq[
i] = 0x1000000 - j;
533 iq[
i] = 0xFFFFFF - j;
539 iq[jz - 1] &= 0x7FFFFF;
542 iq[jz - 1] &= 0x3FFFFF;
548 if (carry != 0)
z -= scalbn(
one, q0);
555 for (
i = jz - 1;
i >= jk;
i--) j |= iq[
i];
557 for (k = 1; jk >= k && iq[jk - k] == 0; k++) {
561 for (
i = jz + 1;
i <= jz + k;
i++) {
562 f[jx +
i] = ipio2[jv +
i];
563 for (j = 0, fw = 0.0; j <= jx; j++) fw +=
x[j] * f[jx +
i - j];
575 while (iq[jz] == 0) {
582 fw =
static_cast<double>(
static_cast<int32_t>(twon24 *
z));
583 iq[jz] =
z - two24 * fw;
593 fw = scalbn(
one, q0);
594 for (
i = jz;
i >= 0;
i--) {
600 for (
i = jz;
i >= 0;
i--) {
601 for (fw = 0.0, k = 0; k <= jp && k <= jz -
i; k++) fw += PIo2[k] * q[
i + k];
609 for (
i = jz;
i >= 0;
i--) fw += fq[
i];
610 y[0] = (ih == 0) ? fw : -fw;
615 for (
i = jz;
i >= 0;
i--) fw += fq[
i];
616 y[0] = (ih == 0) ? fw : -fw;
618 for (
i = 1;
i <= jz;
i++) fw += fq[
i];
619 y[1] = (ih == 0) ? fw : -fw;
622 for (
i = jz;
i > 0;
i--) {
623 fw = fq[
i - 1] + fq[
i];
624 fq[
i] += fq[
i - 1] - fw;
627 for (
i = jz;
i > 1;
i--) {
628 fw = fq[
i - 1] + fq[
i];
629 fq[
i] += fq[
i - 1] - fw;
632 for (fw = 0.0,
i = jz;
i >= 2;
i--) fw += fq[
i];
673V8_INLINE double __kernel_sin(
double x,
double y,
int iy) {
675 half = 5.00000000000000000000e-01,
676 S1 = -1.66666666666666324348e-01,
677 S2 = 8.33333333332248946124e-03,
678 S3 = -1.98412698298579493134e-04,
679 S4 = 2.75573137070700676789e-06,
680 S5 = -2.50507602534068634195e-08,
681 S6 = 1.58969099521155010221e-10;
687 if (ix < 0x3E400000) {
688 if (
static_cast<int>(
x) == 0)
return x;
692 r = S2 +
z * (S3 +
z * (S4 +
z * (S5 +
z *
S6)));
694 return x + v * (S1 +
z *
r);
696 return x - ((
z * (half *
y - v *
r) -
y) - v * S1);
733double __kernel_tan(
double x,
double y,
int iy) {
734 static const double xxx[] = {
735 3.33333333333334091986e-01,
736 1.33333333333201242699e-01,
737 5.39682539762260521377e-02,
738 2.18694882948595424599e-02,
739 8.86323982359930005737e-03,
740 3.59207910759131235356e-03,
741 1.45620945432529025516e-03,
742 5.88041240820264096874e-04,
743 2.46463134818469906812e-04,
744 7.81794442939557092300e-05,
745 7.14072491382608190305e-05,
746 -1.85586374855275456654e-05,
747 2.59073051863633712884e-05,
748 1.00000000000000000000e+00,
749 7.85398163397448278999e-01,
750 3.06161699786838301793e-17
754#define pio4lo xxx[15]
757 double z,
r, v, w,
s;
761 ix = hx & 0x7FFFFFFF;
762 if (ix < 0x3E300000) {
763 if (
static_cast<int>(
x) == 0) {
766 if (((ix | low) | (iy + 1)) == 0) {
767 return one / fabs(
x);
780 return t + a * (s + t * v);
785 if (ix >= 0x3FE59428) {
802 r = T[1] + w * (T[3] + w * (T[5] + w * (T[7] + w * (T[9] + w * T[11]))));
804 (T[2] + w * (T[4] + w * (T[6] + w * (T[8] + w * (T[10] + w * T[12])))));
806 r =
y +
z * (s * (
r + v) +
y);
809 if (ix >= 0x3FE59428) {
811 return (1 - ((hx >> 30) & 2)) * (v - 2.0 * (
x - (w * w / (w + v) -
r)));
828 return t + a * (s + t * v);
864 one = 1.00000000000000000000e+00,
865 pi = 3.14159265358979311600e+00,
866 pio2_hi = 1.57079632679489655800e+00,
867 pio2_lo = 6.12323399573676603587e-17,
868 pS0 = 1.66666666666666657415e-01,
869 pS1 = -3.25565818622400915405e-01,
870 pS2 = 2.01212532134862925881e-01,
871 pS3 = -4.00555345006794114027e-02,
872 pS4 = 7.91534994289814532176e-04,
873 pS5 = 3.47933107596021167570e-05,
874 qS1 = -2.40339491173441421878e+00,
875 qS2 = 2.02094576023350569471e+00,
876 qS3 = -6.88283971605453293030e-01,
877 qS4 = 7.70381505559019352791e-02;
879 double z, p, q,
r, w,
s, c, df;
882 ix = hx & 0x7FFFFFFF;
883 if (ix >= 0x3FF00000) {
886 if (((ix - 0x3FF00000) | lx) == 0) {
890 return pi + 2.0 * pio2_lo;
892 return std::numeric_limits<double>::signaling_NaN();
894 if (ix < 0x3FE00000) {
895 if (ix <= 0x3C600000)
return pio2_hi + pio2_lo;
897 p =
z * (pS0 +
z * (pS1 +
z * (pS2 +
z * (pS3 +
z * (pS4 +
z * pS5)))));
898 q =
one +
z * (qS1 +
z * (qS2 +
z * (qS3 +
z * qS4)));
900 return pio2_hi - (
x - (pio2_lo -
x *
r));
903 p =
z * (pS0 +
z * (pS1 +
z * (pS2 +
z * (pS3 +
z * (pS4 +
z * pS5)))));
904 q =
one +
z * (qS1 +
z * (qS2 +
z * (qS3 +
z * qS4)));
908 return pi - 2.0 * (s + w);
914 c = (
z - df * df) / (s + df);
915 p =
z * (pS0 +
z * (pS1 +
z * (pS2 +
z * (pS3 +
z * (pS4 +
z * pS5)))));
916 q =
one +
z * (qS1 +
z * (qS2 +
z * (qS3 +
z * qS4)));
919 return 2.0 * (df + w);
939 ln2 = 6.93147180559945286227e-01;
944 if (hx < 0x3FF00000) {
945 return std::numeric_limits<double>::signaling_NaN();
946 }
else if (hx >= 0x41B00000) {
947 if (hx >= 0x7FF00000) {
952 }
else if (((hx - 0x3FF00000) | lx) == 0) {
954 }
else if (hx > 0x40000000) {
959 return log1p(t + sqrt(2.0 * t + t * t));
993 one = 1.00000000000000000000e+00,
995 pio2_hi = 1.57079632679489655800e+00,
996 pio2_lo = 6.12323399573676603587e-17,
997 pio4_hi = 7.85398163397448278999e-01,
999 pS0 = 1.66666666666666657415e-01,
1000 pS1 = -3.25565818622400915405e-01,
1001 pS2 = 2.01212532134862925881e-01,
1002 pS3 = -4.00555345006794114027e-02,
1003 pS4 = 7.91534994289814532176e-04,
1004 pS5 = 3.47933107596021167570e-05,
1005 qS1 = -2.40339491173441421878e+00,
1006 qS2 = 2.02094576023350569471e+00,
1007 qS3 = -6.88283971605453293030e-01,
1008 qS4 = 7.70381505559019352791e-02;
1010 double t, w, p, q, c,
r,
s;
1015 ix = hx & 0x7FFFFFFF;
1016 if (ix >= 0x3FF00000) {
1019 if (((ix - 0x3FF00000) | lx) == 0) {
1020 return x * pio2_hi +
x * pio2_lo;
1022 return std::numeric_limits<double>::signaling_NaN();
1023 }
else if (ix < 0x3FE00000) {
1024 if (ix < 0x3E400000) {
1025 if (huge +
x >
one)
return x;
1029 p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
1030 q =
one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
1037 p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
1038 q =
one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
1040 if (ix >= 0x3FEF3333) {
1042 t = pio2_hi - (2.0 * (s + s * w) - pio2_lo);
1046 c = (t - w * w) / (s + w);
1048 p = 2.0 * s *
r - (pio2_lo - 2.0 * c);
1049 q = pio4_hi - 2.0 * w;
1050 t = pio4_hi - (p - q);
1069 one = 1.00000000000000000000e+00,
1070 ln2 = 6.93147180559945286227e-01,
1071 huge = 1.00000000000000000000e+300;
1076 ix = hx & 0x7FFFFFFF;
1077 if (ix >= 0x7FF00000)
return x +
x;
1078 if (ix < 0x3E300000) {
1079 if (huge +
x >
one)
return x;
1081 if (ix > 0x41B00000) {
1082 w =
log(fabs(
x)) + ln2;
1083 }
else if (ix > 0x40000000) {
1117 static const double atanhi[] = {
1118 4.63647609000806093515e-01,
1119 7.85398163397448278999e-01,
1120 9.82793723247329054082e-01,
1121 1.57079632679489655800e+00,
1124 static const double atanlo[] = {
1125 2.26987774529616870924e-17,
1126 3.06161699786838301793e-17,
1127 1.39033110312309984516e-17,
1128 6.12323399573676603587e-17,
1131 static const double aT[] = {
1132 3.33333333333329318027e-01,
1133 -1.99999999998764832476e-01,
1134 1.42857142725034663711e-01,
1135 -1.11111104054623557880e-01,
1136 9.09088713343650656196e-02,
1137 -7.69187620504482999495e-02,
1138 6.66107313738753120669e-02,
1139 -5.83357013379057348645e-02,
1140 4.97687799461593236017e-02,
1141 -3.65315727442169155270e-02,
1142 1.62858201153657823623e-02,
1145 static const double one = 1.0, huge = 1.0e300;
1147 double w, s1, s2,
z;
1151 ix = hx & 0x7FFFFFFF;
1152 if (ix >= 0x44100000) {
1155 if (ix > 0x7FF00000 || (ix == 0x7FF00000 && (low != 0)))
1158 return atanhi[3] + *
const_cast<volatile double*
>(&atanlo[3]);
1160 return -atanhi[3] - *
const_cast<volatile double*
>(&atanlo[3]);
1162 if (ix < 0x3FDC0000) {
1163 if (ix < 0x3E400000) {
1164 if (huge +
x >
one)
return x;
1169 if (ix < 0x3FF30000) {
1170 if (ix < 0x3FE60000) {
1172 x = (2.0 *
x -
one) / (2.0 +
x);
1178 if (ix < 0x40038000) {
1180 x = (
x - 1.5) / (
one + 1.5 *
x);
1192 w * (aT[2] + w * (aT[4] + w * (aT[6] + w * (aT[8] + w * aT[10])))));
1193 s2 = w * (aT[1] + w * (aT[3] + w * (aT[5] + w * (aT[7] + w * aT[9]))));
1195 return x -
x * (s1 + s2);
1197 z = atanhi[id] - ((
x * (s1 + s2) - atanlo[id]) -
x);
1198 return (hx < 0) ? -
z :
z;
1229 static volatile double tiny = 1.0e-300;
1232 pi_o_4 = 7.8539816339744827900E-01,
1233 pi_o_2 = 1.5707963267948965580E+00,
1234 pi = 3.1415926535897931160E+00;
1235 static volatile double pi_lo =
1236 1.2246467991473531772E-16;
1239 int32_t k,
m, hx, hy, ix, iy;
1243 ix = hx & 0x7FFFFFFF;
1245 iy = hy & 0x7FFFFFFF;
1250 if ((SubWithWraparound(hx, 0x3FF00000) | lx) == 0) {
1253 m = ((hy >> 31) & 1) | ((hx >> 30) & 2);
1256 if ((iy | ly) == 0) {
1268 if ((ix | lx) == 0)
return (hy < 0) ? -pi_o_2 - tiny : pi_o_2 + tiny;
1271 if (ix == 0x7FF00000) {
1272 if (iy == 0x7FF00000) {
1275 return pi_o_4 + tiny;
1277 return -pi_o_4 - tiny;
1279 return 3.0 * pi_o_4 + tiny;
1281 return -3.0 * pi_o_4 - tiny;
1297 if (iy == 0x7FF00000)
return (hy < 0) ? -pi_o_2 - tiny : pi_o_2 + tiny;
1300 k = (iy - ix) >> 20;
1302 z = pi_o_2 + 0.5 * pi_lo;
1304 }
else if (hx < 0 && k < -60) {
1315 return pi - (
z - pi_lo);
1317 return (
z - pi_lo) - pi;
1351#if defined(V8_USE_LIBM_TRIG_FUNCTIONS)
1352double fdlibm_cos(
double x) {
1356 double y[2],
z = 0.0;
1364 if (ix <= 0x3FE921FB) {
1365 return __kernel_cos(
x,
z);
1366 }
else if (ix >= 0x7FF00000) {
1371 n = __ieee754_rem_pio2(
x,
y);
1374 return __kernel_cos(
y[0],
y[1]);
1376 return -__kernel_sin(
y[0],
y[1], 1);
1378 return -__kernel_cos(
y[0],
y[1]);
1380 return __kernel_sin(
y[0],
y[1], 1);
1450 halF[2] = {0.5, -0.5},
1451 o_threshold = 7.09782712893383973096e+02,
1452 u_threshold = -7.45133219101941108420e+02,
1453 ln2HI[2] = {6.93147180369123816490e-01,
1454 -6.93147180369123816490e-01},
1455 ln2LO[2] = {1.90821492927058770002e-10,
1456 -1.90821492927058770002e-10},
1457 invln2 = 1.44269504088896338700e+00,
1458 P1 = 1.66666666666666019037e-01,
1459 P2 = -2.77777777770155933842e-03,
1460 P3 = 6.61375632143793436117e-05,
1461 P4 = -1.65339022054652515390e-06,
1462 P5 = 4.13813679705723846039e-08,
1463 E = 2.718281828459045;
1465 static volatile double
1467 twom1000 = 9.33263618503218878990e-302,
1468 two1023 = 8.988465674311579539e307;
1470 double y, hi = 0.0, lo = 0.0, c, t, twopk;
1475 xsb = (hx >> 31) & 1;
1479 if (hx >= 0x40862E42) {
1480 if (hx >= 0x7FF00000) {
1483 if (((hx & 0xFFFFF) | lx) != 0)
1486 return (xsb == 0) ?
x : 0.0;
1488 if (
x > o_threshold)
return huge * huge;
1489 if (
x < u_threshold)
return twom1000 * twom1000;
1493 if (hx > 0x3FD62E42) {
1494 if (hx < 0x3FF0A2B2) {
1499 if (
x == 1.0)
return E;
1500 hi =
x - ln2HI[xsb];
1504 k =
static_cast<int>(invln2 *
x + halF[xsb]);
1506 hi =
x - t * ln2HI[0];
1510 }
else if (hx < 0x3E300000) {
1511 if (huge +
x >
one)
return one +
x;
1521 0x3FF00000 +
static_cast<int32_t
>(
static_cast<uint32_t
>(k) << 20), 0);
1523 INSERT_WORDS(twopk, 0x3FF00000 + (
static_cast<uint32_t
>(k + 1000) << 20),
1526 c =
x - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));
1528 return one - ((
x * c) / (c - 2.0) -
x);
1530 y =
one - ((lo - (
x * c) / (2.0 - c)) - hi);
1533 if (k == 1024)
return y * 2.0 * two1023;
1536 return y * twopk * twom1000;
1558 static const double one = 1.0, huge = 1e300;
1559 static const double zero = 0.0;
1565 ix = hx & 0x7FFFFFFF;
1568 return std::numeric_limits<double>::signaling_NaN();
1570 if (ix == 0x3FF00000) {
1571 return x > 0 ? std::numeric_limits<double>::infinity()
1572 : -std::numeric_limits<double>::infinity();
1574 if (ix < 0x3E300000 && (huge +
x) > zero)
return x;
1576 if (ix < 0x3FE00000) {
1640 ln2_hi = 6.93147180369123816490e-01,
1641 ln2_lo = 1.90821492927058770002e-10,
1642 two54 = 1.80143985094819840000e+16,
1643 Lg1 = 6.666666666666735130e-01,
1644 Lg2 = 3.999999999940941908e-01,
1645 Lg3 = 2.857142874366239149e-01,
1646 Lg4 = 2.222219843214978396e-01,
1647 Lg5 = 1.818357216161805012e-01,
1648 Lg6 = 1.531383769920937332e-01,
1649 Lg7 = 1.479819860511658591e-01;
1651 static const double zero = 0.0;
1653 double hfsq, f,
s,
z, R, w, t1, t2, dk;
1654 int32_t k, hx,
i, j;
1660 if (hx < 0x00100000) {
1661 if (((hx & 0x7FFFFFFF) | lx) == 0) {
1662 return -std::numeric_limits<double>::infinity();
1665 return std::numeric_limits<double>::signaling_NaN();
1671 if (hx >= 0x7FF00000)
return x +
x;
1672 k += (hx >> 20) - 1023;
1674 i = (hx + 0x95F64) & 0x100000;
1678 if ((0x000FFFFF & (2 + hx)) < 3) {
1683 dk =
static_cast<double>(k);
1684 return dk * ln2_hi + dk * ln2_lo;
1687 R = f * f * (0.5 - 0.33333333333333333 * f);
1691 dk =
static_cast<double>(k);
1692 return dk * ln2_hi - ((R - dk * ln2_lo) - f);
1696 dk =
static_cast<double>(k);
1708 return f - (hfsq - s * (hfsq + R));
1710 return dk * ln2_hi - ((hfsq - (s * (hfsq + R) + dk * ln2_lo)) - f);
1713 return f - s * (f - R);
1715 return dk * ln2_hi - ((s * (f - R) - dk * ln2_lo) - f);
1785 ln2_hi = 6.93147180369123816490e-01,
1786 ln2_lo = 1.90821492927058770002e-10,
1787 two54 = 1.80143985094819840000e+16,
1788 Lp1 = 6.666666666666735130e-01,
1789 Lp2 = 3.999999999940941908e-01,
1790 Lp3 = 2.857142874366239149e-01,
1791 Lp4 = 2.222219843214978396e-01,
1792 Lp5 = 1.818357216161805012e-01,
1793 Lp6 = 1.531383769920937332e-01,
1794 Lp7 = 1.479819860511658591e-01;
1796 static const double zero = 0.0;
1798 double hfsq, f, c,
s,
z, R, u;
1799 int32_t k, hx, hu, ax;
1802 ax = hx & 0x7FFFFFFF;
1805 if (hx < 0x3FDA827A) {
1806 if (ax >= 0x3FF00000) {
1808 return -std::numeric_limits<double>::infinity();
1810 return std::numeric_limits<double>::signaling_NaN();
1812 if (ax < 0x3E200000) {
1813 if (two54 +
x > zero
1817 return x -
x *
x * 0.5;
1819 if (hx > 0 || hx <=
static_cast<int32_t
>(0xBFD2BEC4)) {
1825 if (hx >= 0x7FF00000)
return x +
x;
1827 if (hx < 0x43400000) {
1830 k = (hu >> 20) - 1023;
1831 c = (k > 0) ? 1.0 - (u -
x) :
x - (u - 1.0);
1836 k = (hu >> 20) - 1023;
1852 hu = (0x00100000 - hu) >> 2;
1863 return k * ln2_hi + c;
1866 R = hfsq * (1.0 - 0.66666666666666666 * f);
1870 return k * ln2_hi - ((R - (k * ln2_lo + c)) - f);
1875 z * (Lp2 +
z * (Lp3 +
z * (Lp4 +
z * (Lp5 +
z * (Lp6 +
z * Lp7))))));
1877 return f - (hfsq - s * (hfsq + R));
1879 return k * ln2_hi - ((hfsq - (s * (hfsq + R) + (k * ln2_lo + c))) - f);
1939static const double Lg1 = 6.666666666666735130e-01,
1940 Lg2 = 3.999999999940941908e-01,
1941 Lg3 = 2.857142874366239149e-01,
1942 Lg4 = 2.222219843214978396e-01,
1943 Lg5 = 1.818357216161805012e-01,
1944 Lg6 = 1.531383769920937332e-01,
1945 Lg7 = 1.479819860511658591e-01;
1952 double hfsq,
s,
z, R, w, t1, t2;
1961 return s * (hfsq + R);
1975 two54 = 1.80143985094819840000e+16,
1976 ivln2hi = 1.44269504072144627571e+00,
1977 ivln2lo = 1.67517131648865118353e-10;
1979 double f, hfsq, hi, lo,
r, val_hi, val_lo, w,
y;
1986 if (hx < 0x00100000) {
1987 if (((hx & 0x7FFFFFFF) | lx) == 0) {
1988 return -std::numeric_limits<double>::infinity();
1991 return std::numeric_limits<double>::signaling_NaN();
1997 if (hx >= 0x7FF00000)
return x +
x;
1998 if (hx == 0x3FF00000 && lx == 0)
return 0.0;
1999 k += (hx >> 20) - 1023;
2001 i = (hx + 0x95F64) & 0x100000;
2004 y =
static_cast<double>(k);
2040 SET_LOW_WORD(hi, 0);
2041 lo = (f - hi) - hfsq +
r;
2042 val_hi = hi * ivln2hi;
2043 val_lo = (lo + hi) * ivln2lo + lo * ivln2hi;
2047 val_lo += (
y - w) + val_hi;
2050 return val_lo + val_hi;
2081 two54 = 1.80143985094819840000e+16,
2082 ivln10 = 4.34294481903251816668e-01,
2083 log10_2hi = 3.01029995663611771306e-01,
2084 log10_2lo = 3.69423907715893078616e-13;
2093 if (hx < 0x00100000) {
2094 if (((hx & 0x7FFFFFFF) | lx) == 0) {
2095 return -std::numeric_limits<double>::infinity();
2098 return std::numeric_limits<double>::quiet_NaN();
2105 if (hx >= 0x7FF00000)
return x +
x;
2106 if (hx == 0x3FF00000 && lx == 0)
return 0.0;
2107 k += (hx >> 20) - 1023;
2109 i = (k & 0x80000000) >> 31;
2110 hx = (hx & 0x000FFFFF) | ((0x3FF -
i) << 20);
2113 SET_LOW_WORD(
x, lx);
2115 double z =
y * log10_2lo + ivln10 *
log(
x);
2116 return z +
y * log10_2hi;
2217 o_threshold = 7.09782712893383973096e+02,
2218 ln2_hi = 6.93147180369123816490e-01,
2219 ln2_lo = 1.90821492927058770002e-10,
2220 invln2 = 1.44269504088896338700e+00,
2223 Q1 = -3.33333333333331316428e-02,
2224 Q2 = 1.58730158725481460165e-03,
2225 Q3 = -7.93650757867487942473e-05,
2226 Q4 = 4.00821782732936239552e-06,
2227 Q5 = -2.01099218183624371326e-07;
2229 static volatile double huge = 1.0e+300;
2231 double y, hi, lo, c, t, e, hxs, hfx, r1, twopk;
2236 xsb = hx & 0x80000000;
2240 if (hx >= 0x4043687A) {
2241 if (hx >= 0x40862E42) {
2242 if (hx >= 0x7FF00000) {
2245 if (((hx & 0xFFFFF) | low) != 0)
2248 return (xsb == 0) ?
x : -1.0;
2250 if (
x > o_threshold)
return huge * huge;
2259 if (hx > 0x3FD62E42) {
2260 if (hx < 0x3FF0A2B2) {
2271 k = invln2 *
x + ((xsb == 0) ? 0.5 : -0.5);
2273 hi =
x - t * ln2_hi;
2278 }
else if (hx < 0x3C900000) {
2280 return x - (t - (huge +
x));
2288 r1 =
one + hxs * (Q1 + hxs * (Q2 + hxs * (Q3 + hxs * (Q4 + hxs * Q5))));
2290 e = hxs * ((r1 - t) / (6.0 -
x * t));
2292 return x - (
x * e - hxs);
2296 0x3FF00000 +
static_cast<int32_t
>(
static_cast<uint32_t
>(k) << 20),
2298 e = (
x * (e - c) - c);
2300 if (k == -1)
return 0.5 * (
x - e) - 0.5;
2303 return -2.0 * (e - (
x + 0.5));
2305 return one + 2.0 * (
x - e);
2307 if (k <= -2 || k > 56) {
2313 y =
y * 2.0 * 8.98846567431158e+307;
2334 static const uint32_t
2339 static const double P0 = 1.87595182427177009643,
2340 P1 = -1.88497979543377169875,
2341 P2 = 1.621429720105354466140,
2342 P3 = -0.758397934778766047437,
2343 P4 = 0.145996192886612446982;
2346 double r,
s, t = 0.0, w;
2351 sign = hx & 0x80000000;
2353 if (hx >= 0x7FF00000)
return (
x +
x);
2370 if (hx < 0x00100000) {
2371 if ((hx | low) == 0)
return (
x);
2375 INSERT_WORDS(t, sign | ((high & 0x7FFFFFFF) / 3 + B2), 0);
2390 r = (t * t) * (t /
x);
2391 t = t * ((P0 +
r * (P1 +
r * P2)) + ((
r *
r) *
r) * (P3 +
r * P4));
2404 bits = (bits + 0x80000000) & 0xFFFFFFFFC0000000ULL;
2411 r = (
r - t) / (w +
r);
2447#if defined(V8_USE_LIBM_TRIG_FUNCTIONS)
2448double fdlibm_sin(
double x) {
2452 double y[2],
z = 0.0;
2460 if (ix <= 0x3FE921FB) {
2461 return __kernel_sin(
x,
z, 0);
2462 }
else if (ix >= 0x7FF00000) {
2467 n = __ieee754_rem_pio2(
x,
y);
2470 return __kernel_sin(
y[0],
y[1], 1);
2472 return __kernel_cos(
y[0],
y[1]);
2474 return -__kernel_sin(
y[0],
y[1], 1);
2476 return -__kernel_cos(
y[0],
y[1]);
2511 double y[2],
z = 0.0;
2519 if (ix <= 0x3FE921FB) {
2520 return __kernel_tan(
x,
z, 1);
2521 }
else if (ix >= 0x7FF00000) {
2526 n = __ieee754_rem_pio2(
x,
y);
2528 return __kernel_tan(
y[0],
y[1], 1 - ((n & 1) << 1));
2555 static const double KCOSH_OVERFLOW = 710.4758600739439;
2556 static const double one = 1.0, half = 0.5;
2557 static volatile double huge = 1.0e+300;
2566 if (ix < 0x3FD62E43) {
2567 double t =
expm1(fabs(
x));
2570 if (ix < 0x3C800000)
return w;
2571 return one + (t * t) / (w + w);
2575 if (ix < 0x40360000) {
2576 double t =
exp(fabs(
x));
2577 return half * t + half / t;
2581 if (ix < 0x40862E42)
return half *
exp(fabs(
x));
2584 if (fabs(
x) <= KCOSH_OVERFLOW) {
2585 double w =
exp(half * fabs(
x));
2586 double t = half * w;
2591 if (ix >= 0x7FF00000)
return x *
x;
2649 dp_h[] = {0.0, 5.84962487220764160156e-01},
2650 dp_l[] = {0.0, 1.35003920212974897128e-08},
2651 zero = 0.0,
one = 1.0, two = 2.0,
2652 two53 = 9007199254740992.0,
2653 huge = 1.0e300, tiny = 1.0e-300,
2655 L1 = 5.99999999999994648725e-01,
2656 L2 = 4.28571428578550184252e-01,
2657 L3 = 3.33333329818377432918e-01,
2658 L4 = 2.72728123808534006489e-01,
2659 L5 = 2.30660745775561754067e-01,
2660 L6 = 2.06975017800338417784e-01,
2661 P1 = 1.66666666666666019037e-01,
2662 P2 = -2.77777777770155933842e-03,
2663 P3 = 6.61375632143793436117e-05,
2664 P4 = -1.65339022054652515390e-06,
2665 P5 = 4.13813679705723846039e-08,
2666 lg2 = 6.93147180559945286227e-01,
2667 lg2_h = 6.93147182464599609375e-01,
2668 lg2_l = -1.90465429995776804525e-09,
2669 ovt = 8.0085662595372944372e-0017,
2670 cp = 9.61796693925975554329e-01,
2671 cp_h = 9.61796700954437255859e-01,
2672 cp_l = -7.02846165095275826516e-09,
2673 ivln2 = 1.44269504088896338700e+00,
2675 1.44269502162933349609e+00,
2677 1.92596299112661746887e-08;
2679 double z, ax, z_h, z_l, p_h, p_l;
2680 double y1, t1, t2,
r,
s, t, u, v, w;
2681 int i, j, k, yisint,
n;
2687 ix = hx & 0x7fffffff;
2688 iy = hy & 0x7fffffff;
2691 if ((iy | ly) == 0)
return one;
2694 if (ix > 0x7ff00000 || ((ix == 0x7ff00000) && (lx != 0)) || iy > 0x7ff00000 ||
2695 ((iy == 0x7ff00000) && (ly != 0))) {
2706 if (iy >= 0x43400000) {
2708 }
else if (iy >= 0x3ff00000) {
2709 k = (iy >> 20) - 0x3ff;
2712 if ((j << (52 - k)) ==
static_cast<int>(ly)) yisint = 2 - (j & 1);
2713 }
else if (ly == 0) {
2715 if ((j << (20 - k)) == iy) yisint = 2 - (j & 1);
2722 if (iy == 0x7ff00000) {
2723 if (((ix - 0x3ff00000) | lx) == 0) {
2725 }
else if (ix >= 0x3ff00000) {
2726 return (hy >= 0) ?
y : zero;
2728 return (hy < 0) ? -
y : zero;
2731 if (iy == 0x3ff00000) {
2738 if (hy == 0x40000000)
return x *
x;
2739 if (hy == 0x3fe00000) {
2749 if (ix == 0x7ff00000 || ix == 0 || ix == 0x3ff00000) {
2753 if (((ix - 0x3ff00000) | yisint) == 0) {
2755 z = std::numeric_limits<double>::signaling_NaN();
2756 }
else if (yisint == 1) {
2767 if ((n | yisint) == 0) {
2768 return std::numeric_limits<double>::signaling_NaN();
2772 if ((n | (yisint - 1)) == 0) s = -
one;
2775 if (iy > 0x41e00000) {
2776 if (iy > 0x43f00000) {
2777 if (ix <= 0x3fefffff)
return (hy < 0) ? huge * huge : tiny * tiny;
2778 if (ix >= 0x3ff00000)
return (hy > 0) ? huge * huge : tiny * tiny;
2781 if (ix < 0x3fefffff)
return (hy < 0) ? s * huge * huge : s * tiny * tiny;
2782 if (ix > 0x3ff00000)
return (hy > 0) ? s * huge * huge : s * tiny * tiny;
2786 w = (t * t) * (0.5 - t * (0.3333333333333333333333 - t * 0.25));
2788 v = t * ivln2_l - w * ivln2;
2790 SET_LOW_WORD(t1, 0);
2793 double ss, s2, s_h, s_l, t_h, t_l;
2796 if (ix < 0x00100000) {
2801 n += ((ix) >> 20) - 0x3ff;
2802 j = ix & 0x000fffff;
2804 ix = j | 0x3ff00000;
2807 }
else if (j < 0xBB67A) {
2821 SET_LOW_WORD(s_h, 0);
2824 SET_HIGH_WORD(t_h, ((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18));
2825 t_l = ax - (t_h - bp[k]);
2826 s_l = v * ((u - s_h * t_h) - s_h * t_l);
2830 (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));
2831 r += s_l * (s_h + ss);
2834 SET_LOW_WORD(t_h, 0);
2835 t_l =
r - ((t_h - 3.0) - s2);
2838 v = s_l * t_h + t_l * ss;
2841 SET_LOW_WORD(p_h, 0);
2842 p_l = v - (p_h - u);
2844 z_l = cp_l * p_h + p_l * cp + dp_l[k];
2846 t =
static_cast<double>(
n);
2847 t1 = (((z_h + z_l) + dp_h[k]) + t);
2848 SET_LOW_WORD(t1, 0);
2849 t2 = z_l - (((t1 - t) - dp_h[k]) - z_h);
2854 SET_LOW_WORD(y1, 0);
2855 p_l = (
y - y1) * t1 +
y * t2;
2859 if (j >= 0x40900000) {
2860 if (((j - 0x40900000) |
i) != 0) {
2861 return s * huge * huge;
2863 if (p_l + ovt >
z - p_h)
return s * huge * huge;
2865 }
else if ((j & 0x7fffffff) >= 0x4090cc00) {
2866 if (((j - 0xc090cc00) |
i) != 0) {
2867 return s * tiny * tiny;
2869 if (p_l <=
z - p_h)
return s * tiny * tiny;
2876 k = (
i >> 20) - 0x3ff;
2878 if (
i > 0x3fe00000) {
2879 n = j + (0x00100000 >> (k + 1));
2880 k = ((n & 0x7fffffff) >> 20) - 0x3ff;
2883 n = ((n & 0x000fffff) | 0x00100000) >> (20 - k);
2890 v = (p_l - (t - p_h)) * lg2 + t * lg2_l;
2894 t1 =
z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));
2898 j +=
static_cast<int>(
static_cast<uint32_t
>(
n) << 20);
2899 if ((j >> 20) <= 0) {
2904 SET_HIGH_WORD(
z, tmp +
static_cast<int>(
static_cast<uint32_t
>(n) << 20));
2931 static const double KSINH_OVERFLOW = 710.4758600739439,
2933 3.725290298461914e-9,
2934 LOG_MAXD = 709.7822265625;
2935 static const double shuge = 1.0e307;
2937 double h = (
x < 0) ? -0.5 : 0.5;
2939 double ax = fabs(
x);
2942 if (ax < TWO_M28)
return x;
2943 double t =
expm1(ax);
2945 return h * (2 * t - t * t / (t + 1));
2947 return h * (t + t / (t + 1));
2950 if (ax < LOG_MAXD)
return h *
exp(ax);
2953 if (ax <= KSINH_OVERFLOW) {
2954 double w =
exp(0.5 * ax);
2987 static const volatile double tiny = 1.0e-300;
2988 static const double one = 1.0, two = 2.0, huge = 1.0e300;
2993 ix = jx & 0x7FFFFFFF;
2996 if (ix >= 0x7FF00000) {
3004 if (ix < 0x40360000) {
3005 if (ix < 0x3E300000) {
3006 if (huge +
x >
one)
return x;
3008 if (ix >= 0x3FF00000) {
3009 t =
expm1(two * fabs(
x));
3010 z =
one - two / (t + two);
3012 t =
expm1(-two * fabs(
x));
3019 return (jx >= 0) ?
z : -
z;
3029#if defined(V8_USE_LIBM_TRIG_FUNCTIONS) && defined(BUILDING_V8_BASE_SHARED)
3030double libm_sin(
double x) {
return glibc_sin(
x); }
3031double libm_cos(
double x) {
return glibc_cos(
x); }