Disregard ERANGE from libm log when x = 0.
authorTaylor R Campbell <campbell@mumble.net>
Tue, 4 Jun 2013 08:47:43 +0000 (08:47 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Tue, 4 Jun 2013 08:47:45 +0000 (08:47 +0000)
This enables log to usefully raise the IEEE 754 divide-by-zero
exception when the divide-by-zero exception is untrapped.

src/microcode/flonum.c

index 26c45a1830097b0e9ecc42118abb1139c0091ab2..3220598097074d1aee5bd5d5f1306d895c56fac2 100644 (file)
@@ -188,10 +188,23 @@ DEFINE_PRIMITIVE ("FLONUM-LOG1P", Prim_flonum_log1p, 1, 1, 0)
 }
 #endif
 
+DEFINE_PRIMITIVE ("FLONUM-LOG", Prim_flonum_log, 1, 1, 0)
+{
+  double x;
+  double result;
+  PRIMITIVE_HEADER (1);
+  x = (arg_flonum (1));
+  if (! (x >= 0))
+    error_bad_range_arg (1);
+  errno = 0;
+  result = (log (x));
+  if ((errno != 0) && ((x != 0) || (errno != ERANGE)))
+    error_bad_range_arg (1);
+  FLONUM_RESULT (result);
+}
+
 DEFINE_PRIMITIVE ("FLONUM-EXP", Prim_flonum_exp, 1, 1, 0)
      SIMPLE_TRANSCENDENTAL_FUNCTION (exp)
-DEFINE_PRIMITIVE ("FLONUM-LOG", Prim_flonum_log, 1, 1, 0)
-     RESTRICTED_TRANSCENDENTAL_FUNCTION (log, (x > 0))
 DEFINE_PRIMITIVE ("FLONUM-SIN", Prim_flonum_sin, 1, 1, 0)
      SIMPLE_TRANSCENDENTAL_FUNCTION (sin)
 DEFINE_PRIMITIVE ("FLONUM-COS", Prim_flonum_cos, 1, 1, 0)