changeset 421:1c65b5477eaa

Fix real comparison for real: allow +0 to be distinguished from -0.
author Christian Kamm <kamm incasoftware de>
date Mon, 28 Jul 2008 21:37:47 +0200
parents 491264b7cb93
children fa91b03d9cd7
files dmd/expression.c
diffstat 1 files changed, 6 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/expression.c	Mon Jul 28 20:50:41 2008 +0200
+++ b/dmd/expression.c	Mon Jul 28 21:37:47 2008 +0200
@@ -1494,11 +1494,12 @@
 
 int RealEquals(real_t x1, real_t x2)
 {
-    return (isnan(x1) && isnan(x2)) ||
-	/* In some cases, the REALPAD bytes get garbage in them,
-	 * so be sure and ignore them.
-	 */
-	x1 == x2;
+    return // special case nans
+	   (isnan(x1) && isnan(x2)) ||
+	   // and zero, in order to distinguish +0 from -0
+	   (x1 == 0 && x2 == 0 && 1./x1 == 1./x2) ||
+	   // otherwise just compare
+	   (x1 != 0. && x1 == x2);
 }
 
 int RealExp::equals(Object *o)