Re: деление на 6

From
Igor Glukharev (2:5035/26.31)
To
Alexander Golovlev
Date
2002-09-07T14:57:56Z
Area
RU.ALGORITHMS
Hello Alexander!
06 Sep 02  23:28:37 Alexander Golovlev --> Pertzel Family

AG> ATmega103 нет деления, нет умножения. Вычисления не должны занимать 
AG> более 35 операций (операции типа: сдвиг, сложение, вычитание).
PF>  это одно, к вычислениям на "Рейнметалле" с моторчиком,
AG> это другое, а для x86 я бы предложил
AG> программно, сдвигами и сложениями реализовать
AG> умножение на 1/6 .
AG> 
AG> 
AG> Хорошо, а как умножить на 1/6

Если не очень важна точность, то можешь попытаться приблизить 1/6 
другой более удобной дробью для реализации в заданной системе команд. 
Например: 1/6=11/66=~11/64. Тут я думаю все ясно как поделить на 64.
Учитывая, что у тебя 1 байт, можно сделать немного иначе:
1/6=(1*43)/(6*43)=43/258=~43/256
Т.е. просто берем один байт и умножаем его на 43, получаем 2-байтовое
число, от которого просто берем старший байт. 43(10)=101011(2) - 
т.е. 3 сдвига + несколько операций сложения и операций перемещения в памяти.
Максимальная погрешность для байта: |1/6-43/256|*256=0.33333...
Т.е. если тебе важна целая часть и ты собираешься делить на 6 только 
1-байтовые числа, то результат _всегда_ будет точным.

P.S. На крайний случай можно попробовать таблицей 
(если скорость _сильно_ критична).


Bye!    Igor
--- F.I.P.S./32 v1.0r W95/NT [M]
 * Origin:  (2:5035/26.31)