<p dir="ltr">On 13 Jan 2015 02:52, "Alexander Belopolsky" <<a href="mailto:alexander.belopolsky@gmail.com">alexander.belopolsky@gmail.com</a>> wrote:<br>
><br>
> On Mon, Jan 12, 2015 at 9:32 PM, Nathaniel Smith <<a href="mailto:njs@pobox.com">njs@pobox.com</a>> wrote:<br>
>><br>
>> I don't want to step on your positive let's-fix-it attitude, I think that's great, but... I do think you are really underestimating the complexity of the problem.<br>
><br>
><br>
> Didn't IEEE 754 solve this problem for us?  In IEEE 754 the bijection between floats and integers defined by reading float bits as a 64-bit unsigned integer preserves the total ordering and therefore the "closeness".  For finite floats that are not too far apart the difference between the corresponding ints is the same as the difference in ulps.<br>
><br>
> I think something like abs(x.view(int) - y.view(int)) < ulps would be a reasonable implementation for is_close(x, y).</p>
<p dir="ltr">This also has potentially non-intuitive behaviour near zero, and at the least you need to do some thinking about how to handle nans and infs. This seems to be a good article that covers a lot of these kinds of subtleties:</p>
<p dir="ltr"><a href="https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/">https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/</a></p>
<p dir="ltr">(Ulps also require a lot more user sophistication to understand at all, as compared to absolute or relative tolerances.)</p>
<p dir="ltr">It does seem like adding some way to compute ulp differences to the math module might be useful -- regardless of whether it's a panacea, it is a useful option to have, and AFAIK there is no reasonable way to do the computation in pure python currently.</p>
<p dir="ltr">-n</p>