nan.zy 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. (def a NaN)
  2. (def b NaN)
  3. // NaN != NaN needs to return true, but
  4. // NaN == NaN needs to return false.
  5. //
  6. // confirmed this is Go:
  7. // see https://stackoverflow.com/questions/1565164/what-is-the-rationale-for-all-comparisons-returning-false-for-ieee754-nan-values
  8. //
  9. // a := math.NaN()
  10. // b := math.NaN()
  11. // fmt.Printf("nan != nan = '%v'\n", a != b) // true
  12. // fmt.Printf("nan == nan = '%v'\n", a == b) // false
  13. //
  14. // match in zygo:
  15. (assert (!= a b))
  16. (assert (== false (== a b)))
  17. (assert (!= NaN NaN))
  18. (assert (!= nan nan))
  19. (assert (== false (== NaN NaN)))
  20. (assert (== false (== NaN nan)))
  21. (assert (== false (== nan NaN)))
  22. (assert (== false (== nan nan)))
  23. (def c NaN)
  24. (def d NaN)
  25. (assert (!= c d))
  26. // NaN should not equal some other number
  27. // Match the floating point behavior we see in Go:
  28. //
  29. // fmt.Printf("nan == 3.0 = '%v'\n", a == 3.0) // false
  30. // fmt.Printf("nan != 3.0 = '%v'\n", a != 3.0) // true
  31. //
  32. // fmt.Printf("nan == nan = '%v'\n", a == b) // false
  33. //
  34. // fmt.Printf("nan > nan = '%v'\n", a > b) // false
  35. // fmt.Printf("nan >= nan = '%v'\n", a >= b) // false
  36. //
  37. // fmt.Printf("nan < nan = '%v'\n", a < b) // false
  38. // fmt.Printf("nan <= nan = '%v'\n", a <= b) // false
  39. (assert (== false (== 3.0 nan)))
  40. (assert (!= 3.0 nan))
  41. (assert (!= nan 4.0))
  42. (assert (== false (== nan nan)))
  43. (assert (== false (> nan nan)))
  44. (assert (== false (>= nan nan)))
  45. (assert (== false (< nan nan)))
  46. (assert (== false (<= nan nan)))