mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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 @@ def test_milliseconds(self): | ||||||
|             # 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 @@ def test_microseconds(self): | ||||||
|             # 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
	
	 Victor Stinner
						Victor Stinner