Skip to content

Commit aa1b834

Browse files
authored
Merge pull request #137 from juntyr/rint
2 parents 5d44a99 + 54f2057 commit aa1b834

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

quaddtype/numpy_quaddtype/src/ops.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,16 @@ quad_absolute(const Sleef_quad *op)
4040
static inline Sleef_quad
4141
quad_rint(const Sleef_quad *op)
4242
{
43-
return Sleef_rintq1(*op);
43+
Sleef_quad halfway = Sleef_addq1_u05(
44+
Sleef_truncq1(*op),
45+
Sleef_copysignq1(Sleef_cast_from_doubleq1(0.5), *op)
46+
);
47+
48+
// Sleef_rintq1 does not handle some near-halfway cases correctly, so we
49+
// manually round up or down when x is not exactly halfway
50+
return Sleef_icmpeqq1(*op, halfway) ? Sleef_rintq1(*op) : (
51+
Sleef_icmpleq1(*op, halfway) ? Sleef_floorq1(*op) : Sleef_ceilq1(*op)
52+
);
4453
}
4554

4655
static inline Sleef_quad

quaddtype/tests/test_quaddtype.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,12 @@ def test_rounding_functions(op, val):
209209
quad_result), f"Zero sign mismatch for {op}({val})"
210210

211211

212+
def test_rint_near_halfway():
213+
assert np.rint(QuadPrecision("7.4999999999999999")) == 7
214+
assert np.rint(QuadPrecision("7.49999999999999999")) == 7
215+
assert np.rint(QuadPrecision("7.5")) == 8
216+
217+
212218
@pytest.mark.parametrize("op", ["exp", "exp2"])
213219
@pytest.mark.parametrize("val", [
214220
# Basic cases

0 commit comments

Comments
 (0)