summary refs log tree commit diff stats
path: root/tests/float/tfloatnan.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/float/tfloatnan.nim')
-rw-r--r--tests/float/tfloatnan.nim57
1 files changed, 57 insertions, 0 deletions
diff --git a/tests/float/tfloatnan.nim b/tests/float/tfloatnan.nim
new file mode 100644
index 000000000..9e3dd94f6
--- /dev/null
+++ b/tests/float/tfloatnan.nim
@@ -0,0 +1,57 @@
+discard """
+output: '''
+Nim: nan
+Nim: nan (float)
+Nim: nan (double)
+'''
+"""
+
+let f = NaN
+echo "Nim: ", f
+
+let f32: float32 = NaN
+echo "Nim: ", f32, " (float)"
+
+let f64: float64 = NaN
+echo "Nim: ", f64, " (double)"
+
+block: # bug #10305
+  # with `-O3 -ffast-math`, generated C/C++ code is not nan compliant
+  # user can pass `--passC:-ffast-math` if he doesn't care.
+  proc fun() =
+    # this was previously failing at compile time with a nim compiler
+    # that was compiled with `nim cpp -d:release`
+    let a1 = 0.0
+    let a = 0.0/a1
+    let b1 = a == 0.0
+    let b2 = a == a
+    doAssert not b1
+    doAssert not b2
+
+  proc fun2(i: int) =
+    # this was previously failing simply with `nim cpp -d:release`; the
+    # difference with above example is that optimization (const folding) can't
+    # take place in this example to hide the non-compliant nan bug.
+    let a = 0.0/(i.float)
+    let b1 = a == 0.0
+    let b2 = a == a
+    doAssert not b1
+    doAssert not b2
+
+  static: fun()
+  fun()
+  fun2(0)
+
+template main() =
+  # xxx move all tests under here
+  block: # bug #16469
+    let a1 = 0.0
+    let a2 = -0.0
+    let a3 = 1.0 / a1
+    let a4 = 1.0 / a2
+    doAssert a3 == Inf
+    doAssert a4 == -Inf
+    doAssert $(a1, a2, a3, a4) == "(0.0, -0.0, inf, -inf)"
+
+static: main()
+main()