Skip to content

Commit 19326d8

Browse files
authored
fix a divmod bug (RustPython#2025)
1 parent 1527184 commit 19326d8

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

Lib/test/test_builtin.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,8 +446,6 @@ def __dir__(self):
446446
# test that object has a __dir__()
447447
self.assertEqual(sorted([].__dir__()), dir([]))
448448

449-
# TODO: RUSTPYTHON
450-
@unittest.expectedFailure
451449
def test_divmod(self):
452450
self.assertEqual(divmod(12, 7), (1, 5))
453451
self.assertEqual(divmod(-12, 7), (-2, 2))

vm/src/obj/objfloat.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,13 @@ fn inner_floordiv(v1: f64, v2: f64, vm: &VirtualMachine) -> PyResult<f64> {
123123

124124
fn inner_divmod(v1: f64, v2: f64, vm: &VirtualMachine) -> PyResult<(f64, f64)> {
125125
if v2 != 0.0 {
126-
Ok(((v1 / v2).floor(), v1 % v2))
126+
let mut m = v1 % v2;
127+
let mut d = (v1 - m) / v2;
128+
if v2.is_sign_negative() != m.is_sign_negative() {
129+
m += v2;
130+
d -= 1.0;
131+
}
132+
Ok((d, m))
127133
} else {
128134
Err(vm.new_zero_division_error("float divmod()".to_owned()))
129135
}

0 commit comments

Comments
 (0)