mirror of
https://github.com/python/cpython.git
synced 2025-08-23 02:04:56 +00:00
Issue #25155: Fix _PyTime_Divide() rounding
_PyTime_Divide() rounding was wrong: copy code from Python default which has now much better unit tests.
This commit is contained in:
parent
02d6a25bea
commit
ec26f83f2e
2 changed files with 16 additions and 11 deletions
|
@ -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):
|
||||||
# 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue