Hacker News new | ask | show | jobs
by dreish 5009 days ago
This is hardly a JavaScript quirk. In Clojure:

    hackclj.core=> Double/NaN
    NaN
    hackclj.core=> (== Double/NaN Double/NaN)
    false
    hackclj.core=> (= Double/NaN Double/NaN) 
    false
    hackclj.core=> (.equals Double/NaN Double/NaN)
    true
    hackclj.core=> (identical? Double/NaN Double/NaN)
    false
    hackclj.core=> (type Double/NaN)
    java.lang.Double
    hackclj.core=> (number? Double/NaN)
    true
In Perl (which doesn't have a concept of a number type distinct from other scalars such as strings, but we can see that it participates in addition differently from non-numeric scalars, which behave like 0):

      DB<1> $inf = 1e300 * 1e300
    
      DB<2> $nan = $inf - $inf
    
      DB<3> print $nan
    nan
      DB<4> print ($nan == $nan)
    
      DB<5> print ref($nan)
    
      DB<6> print $nan+1   
    nan
In Ruby:

    irb(main):001:0> inf = 1e300*1e300
    => Infinity
    irb(main):002:0> nan = inf-inf
    => NaN
    irb(main):003:0> nan == nan
    => false
    irb(main):004:0> nan.class
    => Float
Python 2.7.3 (much earlier versions got equality wrong, claiming nan == nan):

    >>> inf = 1e300*1e300
    >>> nan = inf-inf
    >>> nan
    nan
    >>> nan == nan
    False
    >>> type(nan)
    <type 'float'>