|
Применение целочисленной арифметики |
|
|
|
Feb 6 2007, 00:15
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Добрый вечер! Для деления чисел с плавающей запятой необходимо много памяти МК. Но знаю, что эту операцию можно сделать, используя целочисленую арифметику. Подскажите, пожалуйста, кто знает как обращаться с этим зверем.
|
|
|
|
|
 |
Ответов
|
Feb 8 2007, 00:51
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(umup @ Feb 7 2007, 20:25)  Яrik Вот сказали бы это сразу и не было бы столько споров, а то уже начали приводить примеры которые на контроллерах почти не встречаются (типа 0.000076538435*25484135е3), в большинстве случаев достаточно 16 или 32 битных целых с фиксированной точкой. Для вашего случая достаточно 2х сдвигов вправо (*256 - это сдвиг влево на 8 разрядов, /1023 - почти сдвиг вправо на 10 разрядов, итого на 2 вправо), и не нужно никаких делений/умножений. Точку между цифрами, надеюсь, сами нарисуете ? А для перевода чисел в строку есть стандартная функция кажется itoa() Для таких случаев бывает формула не очень подходит. Используется бывает коррекция. Если наблюдается нелинейность. Тогда табличным методом. Если хотите всётаки полностью по формуле, то лучше целочисленным методом. Умножение на 256 Вам сказали как (сдвигов конечно не надо, просто результат читаете в байт 1 и 2 (а байт 0 - обнуляете) а деление к примеру так Код ;======================================================================== ; Поделить 32 бита (ddt:ddl) на 32 бита (dv3:dv0). ;------------------------------------------------------------------------ ; Входные регистры: ddt:ddl,dv3:dv0 ; Выходные регистры: ddt:ddl(частное), w3:w2:wh:wl(остаток) ; Портятся регистры: tmp
div32: clrq w ; очистить остаток и перенос ldi tmp,33 ; инициализировать счетчик цикла du_1: rolq dd ; делимое/результат сдвинуть влево dec tmp ; умньшить на единицу счетчик цикла brne du_2 ; переход, если не ноль ret ; выйти du_2: rolq w ; остаток сдвинуть влево subq w,dv ; остаток= остаток - делитель brcc du_3 ; если результат < 0 addq w,dv ; восстановить остаток clc ; сбросить перенос для формирования результата rjmp du_1 ; иначе du_3: sec ; установить перенос для формирования результата rjmp du_1 ; вернуться назад
где
;**************************************************************** ;* Команда SUB для 32-ух битных чисел в регистрах. * ;****************************************************************
.macro subq ; Два параметра "Имя регистров"
sub @0l,@1l ; загрузить регистр 0 sbc @0h,@1h ; загрузить регистр 1 sbc @0d,@1d ; загрузить регистр 2 sbc @0t,@1t ; загрузить регистр 3 .endm
;**************************************************************** ;* Команда ADD для 32-ух битных чисел в регистрах. * ;****************************************************************
.macro addq ; Два параметра "Имя регистров"
add @0l,@1l ; загрузить регистр 0 adc @0h,@1h ; загрузить регистр 1 adc @0d,@1d ; загрузить регистр 2 adc @0t,@1t ; загрузить регистр 3 .endm
;**************************************************************** ;* Команда CLR для 32-ух битных чисел в регистрах. * ;****************************************************************
.macro clrq ; один параметр "Имя регистров"
clr @0l ; загрузить регистр 0 clr @0h ; загрузить регистр 1 clr @0d ; загрузить регистр 2 clr @0t ; загрузить регистр 3 .endm
;**************************************************************** ;* Команда ROL для 32-ух битных чисел в регистрах. * ;****************************************************************
.macro rolq ; один параметр "Имя регистров"
rol @0l ; загрузить регистр 0 rol @0h ; загрузить регистр 1 rol @0d ; загрузить регистр 2 rol @0t ; загрузить регистр 3 .endm
;**************************************************************** ;* Команда LD для 32-ух битных чисел в регистрах. * ;****************************************************************
.macro ldq ; Два параметра "Имя регистров" и "параметр".
ld @0l,@1 ; загрузить регистр 0 ld @0h,@1 ; загрузить регистр 1 ld @0d,@1 ; загрузить регистр 2 ld @0t,@1 ; загрузить регистр 3 .endm
;**************************************************************** ;* Команда ST для 32-ух битных чисел в регистрах. * ;****************************************************************
.macro stq ; Два параметра "Имя регистров" и "параметр".
st @0,@1l ; загрузить регистр 0 st @0,@1h ; загрузить регистр 1 st @0,@1d ; загрузить регистр 2 st @0,@1t ; загрузить регистр 3 .endm
|
|
|
|
|
Feb 8 2007, 19:04
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
To SasaVitebsk. I've rearranged your code a bit. It looks better and quicker now. Sorry for english text, this bl@$dy hell keyboard..
Код ;======================================== ; Поделить 32 бита (ddt:ddl) на 32 бита (dv3:dv0). ;------------------------------------------------------------------------ ; Входные регистры: ddt:ddl,dv3:dv0 ; Выходные регистры: ddt:ddl(частное), w3:w2:wh:wl(остаток) ; Портятся регистры: tmp
div32: clrq w ; очистить остаток и перенос ldi tmp,32 ; инициализировать счетчик цикла du1: subq w,dv ; остаток= остаток - делитель brcc du2 ; если результат < 0 addq w,dv ; восстановить остаток du2: rolq dd ; делимое/результат сдвинуть влево rolq w ; остаток сдвинуть влево dec tmp ; умeньшить на единицу счетчик цикла brne du1 ; переход, если не ноль comq dd ; invert the quotient ret ; выйти
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
Яrik Применение целочисленной арифметики Feb 6 2007, 00:15 umup очень просто - при вычислениях просто используйте ... Feb 6 2007, 00:28 mihask Цитата(Яrik @ Feb 6 2007, 03:15) Добрый в... Feb 6 2007, 05:45 gormih Цитата(mihask @ Feb 6 2007, 03:15) Эффект... Feb 6 2007, 09:49 umup еще посмотрите на http://umup.narod.ru/#books_cs_a... Feb 6 2007, 09:42 Wild007 2 gormih здесь:
Алгоритмические трюки для программ... Feb 6 2007, 09:59 mse Цитата(Яrik @ Feb 6 2007, 00:15) Добрый в... Feb 6 2007, 10:05 SasaVitebsk Цитата(mse @ Feb 6 2007, 11:05) Ничё не п... Feb 6 2007, 11:53 lazycamel Цитата(mse @ Feb 6 2007, 11:05) Плывучка,... Feb 7 2007, 17:02  mse Цитата(lazycamel @ Feb 7 2007, 17:02) Обы... Feb 7 2007, 17:31 Яrik ЦитатаЕдинственное что усложняет работу с флоат эт... Feb 6 2007, 19:25 mse Цитата(Яrik @ Feb 6 2007, 19:25) Цитата Е... Feb 7 2007, 09:50 rezident Цитата(Яrik @ Feb 6 2007, 21:25) Да, да к... Feb 8 2007, 22:16 SasaVitebsk Но результат АЦП - целочисленный.
Пожалуйста, ... Feb 7 2007, 03:21 umup я пользуюсь этим :
http://electronix.ru/forum/ind... Feb 7 2007, 17:08 Яrik ЦитатаПожалуйста, если хотите получить полный отве... Feb 7 2007, 18:25 mse Цитата(umup @ Feb 7 2007, 19:25) Яrik
Во... Feb 8 2007, 11:49 Яrik ЦитатаДля таких случаев бывает формула не очень по... Feb 8 2007, 11:27 SasaVitebsk Цитата(Яrik @ Feb 8 2007, 12:27) Спасибо... Feb 8 2007, 21:30 AndreyKeil Извиняюсь, если мой вопрос не в тему, скажите алго... Feb 8 2007, 21:27 mse Цитата(AndreyKeil @ Feb 8 2007, 21:27) Из... Feb 8 2007, 23:01 add mse, немогли бы Вы пояснитьследующее, если к приме... Feb 9 2007, 12:48 mse Цитата(add @ Feb 9 2007, 12:48) mse, немо... Feb 9 2007, 13:13 Яrik ЦитатаДык это не плавучая арифметика столько памят... Feb 10 2007, 00:15 rezident Цитата(Яrik @ Feb 10 2007, 02:15) Понял. ... Feb 10 2007, 01:16
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|