[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Arithmetic overflow



Kent Pitman points out:

>Please be careful when writing your compilers not to copy the Maclisp bug
>where:
>
>(DEFUN F (X Y) (DECLARE (FIXNUM X Y)) (PLUS X Y))
>
>turns into a single-instruction addition, ignoring overflow. Gerry's proposal
>does not specify much of any way to get code that can do that. It was an
>unfortunate mistake since when X and Y are large, the addition can overflow
>and bad values can get returned (something GJS's proposal frowns on).

I agree whole-heartedly.  Like Gerry's proposal, the ASSERT procedure does
not give the programmer the ability to specify that overflow is to be ignored,
though it can be used to assert that a result is within a certain range.

My last fibonacci example was perhaps too subtle.  In computing (fib 40), the
arguments to + are always less than 100000000 (the constant appearing in the
fixnum? procedure), but the result is greater than 100000000.  A compiler that
assumes that the result of an addition is never greater than the operands is
simply buggy.

				Peace, Will Clinger