summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/nimbase.h7
-rw-r--r--tests/float/tfloatnan.nim22
2 files changed, 28 insertions, 1 deletions
diff --git a/lib/nimbase.h b/lib/nimbase.h
index c06c45691..76192713b 100644
--- a/lib/nimbase.h
+++ b/lib/nimbase.h
@@ -396,8 +396,13 @@ typedef struct TStringDesc* string;
 #define GenericSeqSize sizeof(TGenericSeq)
 #define paramCount() cmdCount
 
+// NAN definition copied from math.h included in the Windows SDK version 10.0.14393.0
 #ifndef NAN
-#  define NAN (0.0 / 0.0)
+#ifndef _HUGE_ENUF
+#define _HUGE_ENUF  1e+300  // _HUGE_ENUF*_HUGE_ENUF must overflow
+#endif
+#define NAN_INFINITY ((float)(_HUGE_ENUF * _HUGE_ENUF))
+#define NAN ((float)(NAN_INFINITY * 0.0F))
 #endif
 
 #ifndef INF
diff --git a/tests/float/tfloatnan.nim b/tests/float/tfloatnan.nim
new file mode 100644
index 000000000..66cb8001d
--- /dev/null
+++ b/tests/float/tfloatnan.nim
@@ -0,0 +1,22 @@
+discard """
+  file: "tfloatnan.nim"
+  output: '''Nim: nan
+Nim: nan (float)
+C: nan (float)
+Nim: nan (double)
+C: nan (double)
+'''
+"""
+
+proc printf(formatstr: cstring): int {.importc: "printf", varargs, header: "<stdio.h>".}
+
+let f = NaN
+echo "Nim: ", f
+
+let f32: float32 = NaN
+echo "Nim: ", f32, " (float)"
+discard printf("C: %f (float)\n", f32)
+
+let f64: float64 = NaN
+echo "Nim: ", f64, " (double)"
+discard printf("C: %lf (double)\n", f64)