New issue 2583: decimal.py: overflow in fraction comparisons https://bitbucket.org/pypy/pypy/issues/2583/decimalpy-overflow-in-fraction-comparisons
Stefan Krah: _convert_for_comparison() should use a maxcontext for a couple of internal operations in order to prevent overflow. Example: ``` >>>> from decimal import * >>>> from fractions import Fraction >>>> c = getcontext() >>>> c.Emax = 1 >>>> c.Emin = -1 >>>> Fraction(1000, 5) == Decimal(200) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/stefan/usr/pypy3-v5.8.0-linux64/lib_pypy/_decimal.py", line 607, in __eq__ r = self._cmp(other, 'eq') File "/home/stefan/usr/pypy3-v5.8.0-linux64/lib_pypy/_decimal.py", line 586, in _cmp a, b = self._convert_for_comparison(other, op) File "/home/stefan/usr/pypy3-v5.8.0-linux64/lib_pypy/_decimal.py", line 494, in _convert_for_comparison ctx, status_ptr) File "/home/stefan/usr/pypy3-v5.8.0-linux64/lib_pypy/_decimal.py", line 1628, in __exit__ self.context._add_status(status) File "/home/stefan/usr/pypy3-v5.8.0-linux64/lib_pypy/_decimal.py", line 1260, in _add_status raise exception decimal.Overflow ``` Relatedly, there is a comment "XXX probably a bug in _decimal.c" in that function. The multiplication is on two integers with a guaranteed exponent of 0. We have two cases: a) The result does not have an exponent of 0. In this case "status" is set and the ValueError is triggered. b) The result has an exponent of zero and the multiplication was exact. The previous exponent is restored, so that the result can have a combination of coefficient and exponent that *could* overflow, if finalized. But this result is only used in mpd_qcmp(), which is safe. So while the code is a bit tricky, there is no bug here. _______________________________________________ pypy-issue mailing list pypy-issue@python.org https://mail.python.org/mailman/listinfo/pypy-issue