> On Oct 27, 2017, at 3:06 AM, Jonathan Hull via swift-dev 
> <swift-dev@swift.org> wrote:
> 
>> 
>> On Oct 26, 2017, at 11:44 PM, Xiaodi Wu <xiaodi...@gmail.com 
>> <mailto:xiaodi...@gmail.com>> wrote:
>> 
>> On Fri, Oct 27, 2017 at 1:30 AM, Jonathan Hull <jh...@gbis.com 
>> <mailto:jh...@gbis.com>> wrote:
>> One completely different idea, which I brought up a year or so ago, is to do 
>> what we do with pointers around this.  That is you have your fast/unsafe 
>> IEEE Floats/Doubles/etc that have a scarier name.  These do not conform to 
>> Equatable or Comparable, but have their own version of IEEE 
>> equality/comparison. Let’s spell it &== and &< to make it feel different so 
>> the users consider the possibility of NaN.  They don’t have any notion of 
>> hashability.
>> 
>> As I wrote in my reply to Greg, IEEE equality and comparison is _the_ best 
>> approximation of mathematical equality and comparison suitable for 
>> floating-point types. If another one were superior, then floating-point 
>> experts would have designated that as the standard.
> 
> We definitely have different world views.  I see the handling of NaN as a 
> legacy/compatibility issue due to committee/vendor politics from the 1980’s.  
> I am pretty sure if they could do it over with modern tech, we would just 
> have isNan() and NaN == NaN… or we might just have optionals instead.

For a sufficiently non-mathematical definition of "logic"...

Logically speaking, NaN == NaN, but mathematically speaking it does not. NaN 
is, by definition, not a number, so asking if it's equal to itself or anything 
else is a mathematically meaningless question (same goes for < and >). If 
you're keeping track of why the answer is NaN, then there's at least a basis 
for discussing the matter... like in `1.0 == sin(x)/x`, where x is 0... Well, 
0/0 is classic example of an undefined result, but the limit of sin(x)/x as x 
approaches 0 does equal 1, so in some sense -- AFAIK a very non-rigorous sense 
-- you'd be not entirely wrong to say that `1 == sin(0)/0` could kinda sorta be 
considered to be "proximately related to `true`" or something. For `==` to know 
that, though, .nan would need to carry the relevant closure and its arguments 
as a payload so that some other bits of logic could know how we got to 0/0, and 
`==` would need in-hardware calculus to verify, in a timely manner, that the 
limit both exists and is the same from both sides (or I suppose the `/` op 
could do it... that'd save on the payload requirements, but you're still stuck 
doing calculus in hardware). Since that's prohibitively impractical, if `==` 
has to give a boolean answer, it is much more correct to say "NaN != NaN". One 
could argue that the semantics of Swift's `==` ought be closer to "matches" 
than "equals", though, which I think is what Xiaodi is getting at.

- Dave Sweeris
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to