I encountered this possible bug while running a property-based test suite in a ClojureCLR project. Given a comparison between NaN in an if expression, it seemingly takes the wrong branch.
Clojure (CLR)
λ cljr
Clojure core loaded in 837 milliseconds.
Starting main
Clojure core loaded in 409 milliseconds.
Clojure 1.12.2
user=> (<= ##NaN ##NaN)
false
user=> (if (<= ##NaN ##NaN) true false)
true
user=> (let [t (<= ##NaN ##NaN)] (if t true false))
false
user=> (>= ##NaN ##NaN)
false
user=> (if (>= ##NaN ##NaN) true false)
true
user=> (let [t (>= ##NaN ##NaN)] (if t true false))
false
I wasn't able to replicate the issue on Clojure (JVM), C#, or F#.
Clojure (JVM)
λ clj
Clojure 1.12.0
user=> (<= ##NaN ##NaN)
false
user=> (if (<= ##NaN ##NaN) true false)
false
user=> (let [t (<= ##NaN ##NaN)] (if t true false))
false
C#
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(Double.NaN <= Double.NaN);
if (Double.NaN <= Double.NaN) {
Console.WriteLine(true);
} else {
Console.WriteLine(false);
}
var t = Double.NaN <= Double.NaN;
if (t) {
Console.WriteLine(true);
} else {
Console.WriteLine(false);
}
}
}
False
False
False
F#
λ dotnet fsi
> nan <= nan;;
val it: bool = false
> if (nan <= nan) then true else false;;
val it: bool = false
> let t = nan <= nan;;
val t: bool = false
> if t then true else false;;
val it: bool = false