core: Avoid Floating point exception dividing negative numbers.

This fixes

    kaem --verbose --strict
    bin/mes-m2 -c '(display (/ -1 1))'

* src/math.c (divide): Use signed division.
This commit is contained in:
Jan (janneke) Nieuwenhuizen 2020-12-29 22:39:31 +01:00
parent 56f9235c10
commit ecb1551b9e
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
1 changed files with 15 additions and 2 deletions

View File

@ -155,18 +155,31 @@ divide (struct scm *x) /*:((name . "/") (arity . n)) */
n = v; n = v;
x = cdr (x); x = cdr (x);
} }
int sign_p = 0;
size_t u = n;
if (n < 0)
{
sign_p = 1;
u = -n;
}
size_t w;
while (x != cell_nil) while (x != cell_nil)
{ {
i = car (x); i = car (x);
assert_number ("divide", i); assert_number ("divide", i);
v = i->value; v = i->value;
sign_p = sign_p && v > 0 || !sign_p && v < 0;
w = v;
if (v == 0) if (v == 0)
error (cstring_to_symbol ("divide-by-zero"), x); error (cstring_to_symbol ("divide-by-zero"), x);
if (n == 0) if (u == 0)
break; break;
n = n / v; u = u / w;
x = cdr (x); x = cdr (x);
} }
n = u;
if (sign_p)
n = -n;
return make_number (n); return make_number (n);
} }