Skip to content

Commit 0f4af07

Browse files
committed
changed 0.0 to 0x0.0p0, fixed MPFRUtils computation of mpfr_sinpi(x) for mpfr versions < 4.2
1 parent 0ad7d39 commit 0f4af07

File tree

2 files changed

+32
-67
lines changed

2 files changed

+32
-67
lines changed

libc/src/math/generic/sinpif16.cpp

Lines changed: 19 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -21,72 +21,25 @@ namespace LIBC_NAMESPACE_DECL {
2121
// Table is generated with Sollya as follows:
2222
// > display = hexadecimmal;
2323
// > for k from 0 to 63 do { round(sin(k * pi/32), SG, RN); };
24-
const float SIN_K_PI_OVER_32[64] = {0,
25-
0x1.917a6cp-4,
26-
0x1.8f8b84p-3,
27-
0x1.294062p-2,
28-
0x1.87de2ap-2,
29-
0x1.e2b5d4p-2,
30-
0x1.1c73b4p-1,
31-
0x1.44cf32p-1,
32-
0x1.6a09e6p-1,
33-
0x1.8bc806p-1,
34-
0x1.a9b662p-1,
35-
0x1.c38b3p-1,
36-
0x1.d906bcp-1,
37-
0x1.e9f416p-1,
38-
0x1.f6297cp-1,
39-
0x1.fd88dap-1,
40-
0x1p0,
41-
0x1.fd88dap-1,
42-
0x1.f6297cp-1,
43-
0x1.e9f416p-1,
44-
0x1.d906bcp-1,
45-
0x1.c38b3p-1,
46-
0x1.a9b662p-1,
47-
0x1.8bc806p-1,
48-
0x1.6a09e6p-1,
49-
0x1.44cf32p-1,
50-
0x1.1c73b4p-1,
51-
0x1.e2b5d4p-2,
52-
0x1.87de2ap-2,
53-
0x1.294062p-2,
54-
0x1.8f8b84p-3,
55-
0x1.917a6cp-4,
56-
0,
57-
-0x1.917a6cp-4,
58-
-0x1.8f8b84p-3,
59-
-0x1.294062p-2,
60-
-0x1.87de2ap-2,
61-
-0x1.e2b5d4p-2,
62-
-0x1.1c73b4p-1,
63-
-0x1.44cf32p-1,
64-
-0x1.6a09e6p-1,
65-
-0x1.8bc806p-1,
66-
-0x1.a9b662p-1,
67-
-0x1.c38b3p-1,
68-
-0x1.d906bcp-1,
69-
-0x1.e9f416p-1,
70-
-0x1.f6297ep-1,
71-
-0x1.fd88dap-1,
72-
-0x1p0,
73-
-0x1.fd88dap-1,
74-
-0x1.f6297cp-1,
75-
-0x1.e9f416p-1,
76-
-0x1.d906bcp-1,
77-
-0x1.c38b3p-1,
78-
-0x1.a9b662p-1,
79-
-0x1.8bc806p-1,
80-
-0x1.6a09e6p-1,
81-
-0x1.44cf32p-1,
82-
-0x1.1c73b4p-1,
83-
-0x1.e2b5d4p-2,
84-
-0x1.87de2ap-2,
85-
-0x1.294062p-2,
86-
-0x1.8f8b84p-3,
87-
-0x1.917a6cp-4};
88-
89-
int32_t range_reduction(float x, float &y) {
24+
static constexpr float SIN_K_PI_OVER_32[64] = {
25+
0x0.0p0, 0x1.917a6cp-4, 0x1.8f8b84p-3, 0x1.294062p-2,
26+
0x1.87de2ap-2, 0x1.e2b5d4p-2, 0x1.1c73b4p-1, 0x1.44cf32p-1,
27+
0x1.6a09e6p-1, 0x1.8bc806p-1, 0x1.a9b662p-1, 0x1.c38b3p-1,
28+
0x1.d906bcp-1, 0x1.e9f416p-1, 0x1.f6297cp-1, 0x1.fd88dap-1,
29+
0x1p0, 0x1.fd88dap-1, 0x1.f6297cp-1, 0x1.e9f416p-1,
30+
0x1.d906bcp-1, 0x1.c38b3p-1, 0x1.a9b662p-1, 0x1.8bc806p-1,
31+
0x1.6a09e6p-1, 0x1.44cf32p-1, 0x1.1c73b4p-1, 0x1.e2b5d4p-2,
32+
0x1.87de2ap-2, 0x1.294062p-2, 0x1.8f8b84p-3, 0x1.917a6cp-4,
33+
0x0.0p0, -0x1.917a6cp-4, -0x1.8f8b84p-3, -0x1.294062p-2,
34+
-0x1.87de2ap-2, -0x1.e2b5d4p-2, -0x1.1c73b4p-1, -0x1.44cf32p-1,
35+
-0x1.6a09e6p-1, -0x1.8bc806p-1, -0x1.a9b662p-1, -0x1.c38b3p-1,
36+
-0x1.d906bcp-1, -0x1.e9f416p-1, -0x1.f6297ep-1, -0x1.fd88dap-1,
37+
-0x1p0, -0x1.fd88dap-1, -0x1.f6297cp-1, -0x1.e9f416p-1,
38+
-0x1.d906bcp-1, -0x1.c38b3p-1, -0x1.a9b662p-1, -0x1.8bc806p-1,
39+
-0x1.6a09e6p-1, -0x1.44cf32p-1, -0x1.1c73b4p-1, -0x1.e2b5d4p-2,
40+
-0x1.87de2ap-2, -0x1.294062p-2, -0x1.8f8b84p-3, -0x1.917a6cp-4};
41+
42+
static LIBC_INLINE int32_t range_reduction(float x, float &y) {
9043
float kf = fputil::nearest_integer(x * 32);
9144
y = fputil::multiply_add<float>(x, 32.0, -kf);
9245

libc/utils/MPFRWrapper/MPFRUtils.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,19 @@ class MPFRNumber {
492492
MPFRNumber value_pi(0.0, 1280);
493493
mpfr_const_pi(value_pi.value, MPFR_RNDN);
494494
mpfr_mul(value_pi.value, value_pi.value, value, MPFR_RNDN);
495-
mpfr_sin(result.value, value_pi.value, mpfr_rounding);
495+
496+
int ret = mpfr_integer_p(value);
497+
MPFRNumber value_mul_two(*this);
498+
mpfr_mul_si(value_mul_two.value, value, 2, MPFR_RNDN);
499+
if (mpfr_integer_p(value_mul_two.value) != 0) {
500+
if (ret != 0) {
501+
mpfr_set_si(result.value, 0, mpfr_rounding);
502+
} else {
503+
mpfr_sin(result.value, value_pi.value, MPFR_RNDN);
504+
}
505+
} else {
506+
mpfr_sin(result.value, value_pi.value, mpfr_rounding);
507+
}
496508
#endif
497509

498510
return result;

0 commit comments

Comments
 (0)