<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Mar 21, 2018 at 3:02 PM, Tim Peters <span dir="ltr"><<a href="mailto:tim.peters@gmail.com" target="_blank">tim.peters@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">[David Mertz]<br>
<span class="">> I've been using and teaching python for close to 20 years and I never<br>
> noticed that x.is_integer() exists until this thread.<br>
<br>
</span>Except it was impossible to notice across most of those years, because<br>
it didn't exist across most of those years ;-)<br></blockquote><div><br></div><div>That's probably some of the reason.  I wasn't sure if someone used the time machine to stick it back into Python 1.4.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">> On the other hand, `x == int(x)` is genuinely obvious..<br>
<br>
</span>But a bad approach:  it can raise OverflowError (for infinite x); it<br>
can raise ValueError (for x a NaN); </blockquote><div><br></div><div>These are the CORRECT answers! Infinity neither is nor is not an integer.  Returning a boolean as an answer is bad behavior; I might argue about *which* exception is best, but False is not a good answer to `float('inf').is_integer()`.  Infinity is neither in the Reals nor in the Integers, but it's just as much the limit of either.</div><div><br></div><div>Likewise Not-a-Number isn't any less an integer than it is a real number (approximated by a floating point number).  It's NOT a number, which is just as much not an integer.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">and can waste relative mountains<br>
of time creating huge integers, e.g.,<br></blockquote><div><br></div><div>True enough. But it's hard to see where that should matter.  No floating point number on the order of 1e306 is sufficiently precise as to be an integer in any meaningful sense.  If you are doing number theory with integers of that size (or larger is perfectly fine too) the actual test is `isinstance(x, int)`.  Using a float is just simply wrong for the task to start with, whether or not those bits happen to represent something Integral... the only case where you should see this is "measuring/estimating something VERY big, very approximately."</div><div><br></div><div>For example, this can be true (even without reaching inf):</div><div><br></div><div>>>> x.is_integer()</div><div>True</div><div>>>> (math.sqrt(x**2)).is_integer()</div><div>False</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The problem there isn't  how "is it an integer?" is spelled, it's that<br>
_any_ way of spelling "is it an integer?" doesn't answer the question<br>
they're trying to answer.  They're just plain confused about how<br>
floating point works.  The use of `.is_integer()` (however spelled!)<br>
isn't the cause of that, it's a symptom.<br>
</blockquote></div><br>Agreed!<br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Keeping medicines from the bloodstreams of the sick; food <br>from the bellies of the hungry; books from the hands of the <br>uneducated; technology from the underdeveloped; and putting <br>advocates of freedom in prisons.  Intellectual property is<br>to the 21st century what the slave trade was to the 16th.<br></div>
</div></div>