Fix flonum case of ROUND to use IEEE round-to-even, per the R5RS.
authorTaylor R Campbell <campbell@mumble.net>
Fri, 13 Nov 2009 03:48:28 +0000 (22:48 -0500)
committerTaylor R Campbell <campbell@mumble.net>
Fri, 13 Nov 2009 03:48:28 +0000 (22:48 -0500)
src/microcode/artutl.c

index cd6addc5fccdb621df05c75e3d22ee2bf61a97d7..9c4ed75440c4189103e54bcc2e14bda89ceca1d0 100644 (file)
@@ -126,7 +126,15 @@ double_truncate (double x)
 double
 double_round (double x)
 {
-  return (double_truncate ((x < 0) ? (x - 0.5) : (x + 0.5)));
+  double integral;
+  double fractional = (fabs (modf (x, (&integral))));
+
+  if ((fractional == 0.5)
+      ? ((fmod (integral, 2.0)) == 0.0)
+      : (! (0.5 < fractional)))
+    return (integral);
+  else
+    return (integral + (copysign (x, 1.0)));
 }
 \f
 /* Conversions between Scheme types and Scheme types. */