B – 3
B
Division Exceptions
In addition to proper output format, you must insure that a divide
overflow does not occur. Even if a division of two numbers produces a
legal output format, it is possible that the number will overflow, and be
unable to fit within the constraints of the output. For example, if you
wished to divide a 16.16 number by a 1.15 number, the output format
would be (16-1+1).(16-15-1) or 16.0 which is legal. Now assume you
happened to have 16384 (0x4000) as the dividend and .25 (0x2000) as the
divisor, the quotient would be 65536, which does not fit in 16.0 format.
This operation would overflow, producing an erroneous results.
Input operands can be checked before division to ensure that an overflow
will not result. If the magnitude of the upper 16 bits of the dividend is
larger than the magnitude of the divisor, an overflow will result.
B.1.4
Integer Division
One special case of division that deserves special mention is integer
division. There may be some cases where you wish to divide two integers,
and produce an integer result. It can be seen that an integer-integer
division will produce an invalid output format of (32-16+1).(0-0-1), or
17.-1.
To generate an integer quotient, you must shift the dividend to the left one
bit, placing it in 31.1 format. The output format for this division will be
(31-16+1).(1-0-1), or 16.0. You must ensure that no significant bits are lost
during the left shift, or an invalid result will be generated.
B.2
ERROR CONDITIONS
Although the divide primitives for the ADSP-2100 family work correctly
in most instances, there are two cases where an invalid or inaccurate result
can be generated. The first case involves signed division by a negative
number. If you attempt to use a negative number as the divisor, the
quotient generated may be one LSB less than the correct result. The other
case concerns unsigned division by a divisor greater than 0x7FFF. If the
divisor in an unsigned division exceeds 0x7FFF, an invalid quotient will
be generated.
B.2.1
Negative Divisor Error
The quotient produced by a divide with a negative divisor will generally
be one LSB less than the correct result. The divide algorithm implemented
on the ADSP-2100 family does not correctly compensate for the twos-
complement format of a negative number, causing this inaccuracy.