[Python-Dev] Deprecating float.is_integer() (original) (raw)
David Mertz mertz at gnosis.cx
Wed Mar 21 21:15:20 EDT 2018
- Previous message (by thread): [Python-Dev] Deprecating float.is_integer()
- Next message (by thread): [Python-Dev] Deprecating float.is_integer()
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Ok. I'm wrong on that example.
On Wed, Mar 21, 2018, 9:11 PM Tim Peters <tim.peters at gmail.com> wrote:
[David Mertz <mertz at gnosis.cx>] >> For example, this can be true (even without reaching inf): >> >> >>> x.isinteger() >> True >> >>> (math.sqrt(x**2)).isinteger() >> False
[Mark Dickinson <dickinsm at gmail.com> ] > If you have a moment to share it, I'd be interested to know what value of >
x
you used to achieve this, and what system you were on. This can't happen > under IEEE 754 arithmetic. I expect it might happen under one of the directed rounding modes (like "to +infinity"). But under 754 binary round-nearest/even arithmetic, it's been formally proved that sqrt(x*x) == x exactly for all non-negative finite x such that x*x neither overflows nor underflows (and .asinteger() has nothing to do with that very strong result): https://hal.inria.fr/hal-01148409/document OTOH, the paper notes that it's not necessarily true for IEEE decimal arithmetic; e.g., >>> import decimal >>> decimal.getcontext().prec = 4 >>> (decimal.Decimal("31.66") ** 2).sqrt() # result is 1 ulp smaller Decimal('31.65') >>> decimal.getcontext().prec = 5 >>> (decimal.Decimal("31.660") ** 2).sqrt() # result is 1 ulp larger Decimal('31.661') -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-dev/attachments/20180322/571bb01e/attachment.html>
- Previous message (by thread): [Python-Dev] Deprecating float.is_integer()
- Next message (by thread): [Python-Dev] Deprecating float.is_integer()
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]