On 10 October 2012 02:14, Steven D'Aprano <span dir="ltr"><<a href="mailto:steve@pearwood.info" target="_blank">steve@pearwood.info</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im">On 10/10/12 09:13, Joshua Landau wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Just a curiosity here (as I can guess of plausible reasons myself, so there<br>
probably are some official stances).<br>
<br>
Is there a reason NaNs are not instances of NaN class?<br>
</blockquote>
<br></div>
Because that would complicate Python's using floats for absolutely no benefit.<br>
Instead of float operations always returning a float, they would have to return<br>
a float or a NAN. To check for a valid floating point instance, instead of<br>
saying:<br>
<br>
isinstance(x, float)<br>
<br>
you would have to say:<br>
<br>
isinstance(x, (float, NAN))<br></blockquote><div> </div><div>Not the way I'm proposing it.</div><div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<font face="courier new, monospace">>>> class NAN(float):<br>...     def __new__(self):<br>...             return float.__new__(self, "nan")<br>...     def __eq__(self, other):<br>...             return other is self<br>

... <br>>>> isinstance(NAN(), float)<br>True<br>>>> NAN() is NAN()<br>False<br>>>> NAN() == NAN()<br>False<br>>>> x = NAN()<br>>>> x is x<br>True<br>>>> x == x<br>True<br>

>>> x<br>nan</font></blockquote></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
And what about infinities, denorm numbers, and negative zero? Do they get<br>
dedicated classes too?<br></blockquote><div><br></div><div>Infinities? No, although they might well if the infinities were different (set of reals vs set of ints, for example).</div><div>Denorms? No, that's a completely different thing.</div>

<div>-0.0? No, that's a completely different thing.</div><div> </div><div>I was asking, because instances of a class maps on to a behavior that matches *almost exactly* what *both* parties want, why was it not used? This is not the case with anything other than that.</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
And what is the point of this added complexity? Nothing.<br></blockquote><div><br></div><div>Simplicity. It's simpler.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


You *still* have the rule that "x == x for all x, except for NANs".</blockquote><div><br></div><div>False. I was proposing that x == x but NAN() != NAN().</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

The only difference is that "NANs" now means "instances of NAN class" rather than<br>
"NAN floats" (and Decimals).</blockquote><div><br></div><div>False, if you subclass float.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Working with IEEE 754 floats is now far more of<br>
a nuisance because some valid floating point values aren't floats but have a<br>
different class, but nothing meaningful is different.</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

 </blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Then x == x would be True (as they want), but [this NaN] == [that NaN]<br>
would be False, as expected.<br>
</blockquote>
<br></div>
Making NANs their own class wouldn't give you that. If we wanted that<br>
behaviour, we could have it without introducing a NAN class: just change the<br>
list __eq__ method to scan the list for a NAN using math.isnan before checking<br>
whether the lists were identical.<br></blockquote><div><br></div><div>False.</div><div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<font face="courier new, monospace">>>> x == x<br>True<br>>>> [NAN()] == [NAN()]<br>False</font></blockquote></div><div><br></div><div>as per my previous "implementation".</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


But that would defeat the purpose of the identity check (an optimization to<br>
avoid scanning the list)! Replacing math.isnan with isinstance doesn't change<br>
that.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I guess that raises the question about why x == x but sqrt(-1) != sqrt(-1),<br>
</blockquote>
<br></div>
That question has already been raised, and answered, repeatedly in this thread.</blockquote><div> </div><div>False. x != x, so that has <i>not</i> been "answered". This was an example problem with my own suggested implementation.</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
but it seems a lot less of a big deal than all of the exceptions with<br>
container equalities.<br>
</blockquote>
<br></div>
Container equalities are not a big deal. I'm not sure what problem you think<br>
you are solving.</blockquote><div><br></div><div> Why would you assume that? I mentioned it from <i>honest</i> <b>curiosity</b>, and all I got back was an attack. Please, I want to be civil but you need to act less angrily.</div>

<div><br></div><div>[Has not been spell-checked, as I don't really have time </lie>]</div><div><br></div><div>Thank you for your time, even though I disagree,</div><div><br></div><div>Joshua Landau</div></div>