реклама на сайте
подробности

 
 
> Применение целочисленной арифметики
Яrik
сообщение Feb 6 2007, 00:15
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Добрый вечер!

Для деления чисел с плавающей запятой необходимо много памяти МК. Но знаю, что эту операцию можно сделать, используя целочисленую арифметику.
Подскажите, пожалуйста, кто знает как обращаться с этим зверем. biggrin.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
umup
сообщение Feb 7 2007, 19:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720



Яrik
Вот сказали бы это сразу и не было бы столько споров, а то уже начали приводить примеры которые на контроллерах почти не встречаются (типа 0.000076538435*25484135е3), в большинстве случаев достаточно 16 или 32 битных целых с фиксированной точкой.
Для вашего случая достаточно 2х сдвигов вправо (*256 - это сдвиг влево на 8 разрядов, /1023 - почти сдвиг вправо на 10 разрядов, итого на 2 вправо), и не нужно никаких делений/умножений. Точку между цифрами, надеюсь, сами нарисуете ?
А для перевода чисел в строку есть стандартная функция кажется itoa()

Сообщение отредактировал umup - Feb 7 2007, 19:30
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 8 2007, 00:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
=GM=
сообщение Feb 8 2007, 19:04
Сообщение #4


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                              ; выйти



--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Я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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 21:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01359 секунд с 7
ELECTRONIX ©2004-2016