Kaydet (Commit) ec26f83f authored tarafından Victor Stinner's avatar Victor Stinner

Issue #25155: Fix _PyTime_Divide() rounding

_PyTime_Divide() rounding was wrong: copy code from Python default which has
now much better unit tests.
üst 02d6a25b
...@@ -946,14 +946,14 @@ class TestPyTime_t(unittest.TestCase): ...@@ -946,14 +946,14 @@ class TestPyTime_t(unittest.TestCase):
# nanoseconds # nanoseconds
(1, 0, FLOOR), (1, 0, FLOOR),
(1, 1, CEILING), (1, 1, CEILING),
(-1, 0, FLOOR), (-1, -1, FLOOR),
(-1, -1, CEILING), (-1, 0, CEILING),
# seconds + nanoseconds # seconds + nanoseconds
(1234 * MS_TO_NS + 1, 1234, FLOOR), (1234 * MS_TO_NS + 1, 1234, FLOOR),
(1234 * MS_TO_NS + 1, 1235, CEILING), (1234 * MS_TO_NS + 1, 1235, CEILING),
(-1234 * MS_TO_NS - 1, -1234, FLOOR), (-1234 * MS_TO_NS - 1, -1235, FLOOR),
(-1234 * MS_TO_NS - 1, -1235, CEILING), (-1234 * MS_TO_NS - 1, -1234, CEILING),
): ):
with self.subTest(nanoseconds=ns, milliseconds=ms, round=rnd): with self.subTest(nanoseconds=ns, milliseconds=ms, round=rnd):
self.assertEqual(PyTime_AsMilliseconds(ns, rnd), ms) self.assertEqual(PyTime_AsMilliseconds(ns, rnd), ms)
...@@ -983,14 +983,14 @@ class TestPyTime_t(unittest.TestCase): ...@@ -983,14 +983,14 @@ class TestPyTime_t(unittest.TestCase):
# nanoseconds # nanoseconds
(1, 0, FLOOR), (1, 0, FLOOR),
(1, 1, CEILING), (1, 1, CEILING),
(-1, 0, FLOOR), (-1, -1, FLOOR),
(-1, -1, CEILING), (-1, 0, CEILING),
# seconds + nanoseconds # seconds + nanoseconds
(1234 * US_TO_NS + 1, 1234, FLOOR), (1234 * US_TO_NS + 1, 1234, FLOOR),
(1234 * US_TO_NS + 1, 1235, CEILING), (1234 * US_TO_NS + 1, 1235, CEILING),
(-1234 * US_TO_NS - 1, -1234, FLOOR), (-1234 * US_TO_NS - 1, -1235, FLOOR),
(-1234 * US_TO_NS - 1, -1235, CEILING), (-1234 * US_TO_NS - 1, -1234, CEILING),
): ):
with self.subTest(nanoseconds=ns, milliseconds=ms, round=rnd): with self.subTest(nanoseconds=ns, milliseconds=ms, round=rnd):
self.assertEqual(PyTime_AsMicroseconds(ns, rnd), ms) self.assertEqual(PyTime_AsMicroseconds(ns, rnd), ms)
......
...@@ -305,17 +305,22 @@ _PyTime_AsNanosecondsObject(_PyTime_t t) ...@@ -305,17 +305,22 @@ _PyTime_AsNanosecondsObject(_PyTime_t t)
} }
static _PyTime_t static _PyTime_t
_PyTime_Divide(_PyTime_t t, _PyTime_t k, _PyTime_round_t round) _PyTime_Divide(const _PyTime_t t, const _PyTime_t k,
const _PyTime_round_t round)
{ {
assert(k > 1); assert(k > 1);
if (round == _PyTime_ROUND_CEILING) { if (round == _PyTime_ROUND_CEILING) {
if (t >= 0) if (t >= 0)
return (t + k - 1) / k; return (t + k - 1) / k;
else
return t / k;
}
else {
if (t >= 0)
return t / k;
else else
return (t - (k - 1)) / k; return (t - (k - 1)) / k;
} }
else
return t / k;
} }
_PyTime_t _PyTime_t
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment