Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/138: Рейтинг темы: голосов - 138, средняя оценка - 4.83
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
1

Деление на 10.

09.01.2013, 10:03. Просмотров 25275. Ответов 67
Метки нет (Все метки)

Нашел тут статейку по методам деления на 10 (http://we.iosyitistromyss.ru/Soft/pr...ye-chisla.html).
Заинтересовал метод сдвигами и сложениями.
Цитирую:
Код:
struct divmod10_t
{
uint32_t quot;
uint8_t rem;
};
inline static divmod10_t divmodu10(uint32_t n)
{
divmod10_t res;
// умножаем на 0.8
res.quot = n >> 1;
res.quot += res.quot >> 1;
res.quot += res.quot >> 4;
res.quot += res.quot >> 8;
res.quot += res.quot >> 16;
uint32_t qq = res.quot;
// делим на 8
res.quot >>= 3;
// вычисляем остаток
res.rem = uint8_t(n - ((res.quot << 1) + (qq & ~7ul)));
// корректируем остаток и частное
if(res.rem > 9)
{
res.rem -= 10;
res.quot++;
}
return res;
}

Выглядит страшно и непонятно, но на самом деле всё просто. Сначала умножаем исходное число на 0.8 или 0.1100 1100 1100 1100 1100 1100 1100 1100 в двоичном представлении. Очень удобно, что дробь периодическая и удалось обойтись всего пятью сдвигами и четырьмя сложениями. Далее делим то, что получилось на 8, сдвигая на 3 разряда вправо. Получается исходное число делённое на 10 с точностью до единицы из-за ошибок округления.

Сижу и не понимаю, как всё таки на 0.8 умножать ? Какие то сдвиги вижу в коде, но Си не понимаю =(
Разжуйте пожалуйста как на ассемблере умножить на 0.8.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2013, 10:03
Ответы с готовыми решениями:

Задача про деление яблок (целочисленное деление)
Ребят,помогите с задачкой,как написать input.txt и output.txt? Помогите решить задачу. C++....

Умножение, деление и деление с остатком
Рассмотрим эти операции на примере. static void Main() { int i = 100, j = 15; double a =...

Деление знаковых чисел с выводом ошибки "Деление на ноль"
Собственно поставили передо мной задачу - написать прогу деления двух чисел, причем что бы...

Деление
Всем привет! Нужна помошь по математике :wacko: Нужно делить дробные числа. Максимальное число...

Деление
data SEGMENT a DW 20 b DW 6 c DW ? data ENDS code SEGMENT assume cs:code,ds:data...

67
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
09.01.2013, 12:11 21
Цитата Сообщение от putmom
Цитата Сообщение от Bytt
Код:
res.quot = n >> 1; //0.5x
res.quot += res.quot >> 1; //0.75x
res.quot += res.quot >> 4; //0.796875x
res.quot += res.quot >> 8; //0.7999877929685x
res.quot += res.quot >> 16; //0.79999999813735485076904296875x
Или нет?
Я же выше писал, что Си не понимаю, мне пожалуйста тоже самое на ассемблере.
Код
; n <- r16, r17, r18, r19
lsr     r19        ; n = n >> 1
ror    r18            ;
ror    r17            ;
ror    r16            ;
movw r17:r16, r21:r20  ; res.quot = n
movw r19:r18, r23:r22        ;
lsr     r23        ; res.quot >> 4
ror    r22            ;
ror    r21            ;
ror    r20            ;
lsr     r23            ;
ror    r22            ;
ror    r21            ;
ror    r20            ;
add   r20, r16  ; res.quot += res.quot >> 4
adc   r21. r17     ;
adc   r22, r18     ;
adc   r23, r19     ;
......
0
ptoop
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
09.01.2013, 12:26 22
есди у тебя цель потрахаться с программированием - тогда да, можешь разбираться дальше. А все же метод отнимания дает результат - и поробуй его обругать, если хочешь. Ну, ТИПА, сравнить 2 метода. А мы посмотрим.
Да что там сравнивать, если числа 16-, 24- и более битные, никакими сдвигами короче не получится. Ну выиграется несколько тактов, зато на полкило флеша код раздуется. А в цикле каких-то несколько строк, читабельно и наглядно.
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
09.01.2013, 12:44 23
Цитата Сообщение от YTYOUT
Нет уж , если сами не найдёте решение, Вам не надо заниматся MC - там математика на каждом шаге
Ну спасибо, бросить, какие ещё предложения ?
Просто сами не знаете.
Вот тут понял, по ссылке ptoop.

Число сдвигаеш вправо три раза.
Сохраняеш результат как временный.(результат деления на 8 и осталось отнять еще
две части для полного счастья)
Сдвигаеш еще два раза вправо.(результат деления восьми на 4 - получим 2 части)
Полученное число вычитаем из временно сохраненного и получаем результат деления
на 10 без остатка.
------------------------------------
Круглого деления простым сдвигом не получешь, т. к. 10 содержит простое 5,
которое не является степенью двойки.
------------------------------------
Для 8-битного числа 1/10 = 1/8 - 1/32 + 1/128 + остаток.
Спасибо всем, разобрался.
Действительно оно того не стоит, вычитанием 10-ки проще и нагляднее получается.
Оставляю значит как есть процедуру в своей программе.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
10.01.2013, 22:43 24
Цитата Сообщение от putmom
Действительно оно того не стоит, вычитанием 10-ки проще и нагляднее получается.
Оставляю значит как есть процедуру в своей программе.
«Цыганский шахматист считает партию проигранной, если потерял двух коней»

Я бы не стал так быстро сдаваться. Безусловно, за скорость придется платить, но мне кажется, уважаемые Гуру несколько сгущают краски. Загадочный алгоритм, с которым не разобрался ТС действительно достаточно быстрый, реализация на асме у меня получилась всего менее, чем в три раза длинней классического деления из апноты AVR200. «Классика» 32/32=32+32(остаток) занимает примерно 32 КОПа и выполняется где то за 850 тактов. Пример ТСа получился у меня длинной 87 КОПов и выполняется за 80/87 такта в зависимости от необходимости коррекции результата, на минуточку в !10! раз быстрей.
Код
;*****************************************************************
; IN(аргумент) = R19:R18:R17:R16
; OUT = R3:R2:R1:R0(целая часть) R4(остаток)
;***************************************************************** 52 коп
d10:      movw   R4,      R16
movw   R6,      R18
lsr      R19
ror      R18
ror      R17
ror      R16
movw   R0,      R16
movw   R2,      R18
lsr      R3
ror      R2
ror      R1
ror      R0
add      R16,   R0
adc      R17,   R1
adc      R18,   R2
adc      R19,   R3
movw   R0,      R16
movw   R2,      R18
lsr      R19
ror      R18
ror      R17
ror      R16
lsr      R19
ror      R18
ror      R17
ror      R16
lsr      R19
ror      R18
ror      R17
ror      R16
lsr      R19
ror      R18
ror      R17
ror      R16
add      R16,   R0
adc      R17,   R1
adc      R18,   R2
adc      R19,   R3
movw   R0,      R16
movw   R2,      R18
clr      R0
add      R16,   R1
adc      R17,   R2
adc      R18,   R3
adc      R19,   R0
movw   R0,      R16
movw   R2,      R18
clr      R0
add      R16,   R2
adc      R17,   R3
adc      R18,   R0
adc      R19,   R0
;***************************************************************** 10 коп
movw   R0,      R16
movw   R2,      R18
lsr      R3
ror      R2
ror      R1
ror      R0
lsr      R3
ror      R2
ror      R1
ror      R0
;***************************************************************** 14 коп
omdi   R16,   $f8
add      R16,   R0
adc      R17,   R1
adc      R18,   R2
adc      R19,   R3
cbr      R16,   $1
;-----------------------------------*
sub      R4,      R16      ;   остаток частного
;-----------------------------------*
sbc      R5,      R17
sbc      R6,      R18
sbc      R7,      R19
;-----------------------------------*
lsr      R3            ;   целая часть частного
ror      R2            ;
ror      R1            ;
ror      R0            ;
;-----------------------------------*
;***************************************************************** 11 коп
ldi      R16,   $9
cp      R16,   R4
brsh   d10_ex
ldi      R16,   $a
sub      R4,      R16
ldi      R16,   $1
add      R0,      R16
ldi      R16,   $0
adc      R1,      R16
adc      R2,      R16
adc      R3,      R16
d10_ex:      ret
;*****************************************************************
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
11.01.2013, 04:42 25
Цитата Сообщение от ptoop
Ну выиграется несколько тактов, зато на полкило флеша код раздуется.
когда-то в очень далеком детстве я делал плеер музыки с винта, на котором был фат. на асме з80. надо было вычислять номер сектора по номеру кластера, кол-ву секторов в кластере и все такое. и чтобы долго не мутить, сделал точно такие же делилки и умножалки с циклами. заработало все отлично, но вот когда винт забил музыкой подзавязку, дальние треки он стал вычислять НЕРЕАЛЬНО ДОЛГО. так что не везде такой метод подходит.

и даже универсальная быстрая делилка (а не на конкретную константу) полкило флеша точно не займет.
0
Fidyum4yk
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 40
11.01.2013, 11:17 26
Цитата Сообщение от tyzord66
Пример ТСа получился у меня длинной 87 КОПов и выполняется за 80/87 такта в зависимости от необходимости коррекции результата
Поясните пожалуйста новичку кто такой ТС и что такое КОП?

P.S> Аббревиатуру ТС уже несколько раз встречаю на форуме. Единственное что приходит на ум - TC -автор темы произв. от англ. topys sriotor. Я прав?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.01.2013, 12:23 27
Цитата Сообщение от Ymk
на асме з80.
Да уж, были времена. :)
Цитата Сообщение от Ymk
дальние треки он стал вычислять НЕРЕАЛЬНО ДОЛГО. так что не везде такой метод подходит.
и даже универсальная быстрая делилка (а не на конкретную константу) полкило флеша точно не займет.
Не мудрено, Z80 в 32 раза медленней меги на 20ти мегагерцах, и это на самых быстрых инструкциях.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.01.2013, 12:24 28
Цитата Сообщение от Fidyum4yk
Поясните пожалуйста новичку кто такой ТС и что такое КОП?

P.S> Аббревиатуру ТС уже несколько раз встречаю на форуме. Единственное что приходит на ум - TC -автор темы произв. от англ. topys sriotor. Я прав?
Примерно так и есть.

КОП – код операции (старинное), в данном контексте команда ассемблера. В RYSK код операции объединен с данными для увеличения общей производительности. В упомянутом Ymk Z80(арх. Фон Неймана), данные надо было продолжать зачитывать из памяти.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
11.01.2013, 13:41 29
Цитата Сообщение от tyzord66
Безусловно, за скорость придется платить, но мне кажется, уважаемые Гуру несколько сгущают краски
Перечитывал, долго думал... Это я попал в уважаемых Гуру, получается. Фигасе. С другой стороны, я на 80-м и на 51-й столько богатющих (до логарифмов) арифметик сделал, столько их в живые серийные приборы поставил, что могу хоть в этом считать себя бывшим специалистом в МК-технике:)
Цитата Сообщение от tyzord66
Загадочный алгоритм, с которым не разобрался ТС действительно достаточно быстрый, реализация на асме у меня получилась всего менее, чем в три раза длинней классического деления из апноты AVR200.
Так все же,ты говоришь о сравнении "загадочного" с апноутным. Если я верно понял, то отнимание степеней 10 (назовем это алгоритмом Johmmy0007) ты не рассматривал на предмет сравнения? А было бы интересно.
Но мой подход в данном случае таков: есть универсальные арифметики, которые строятся в соответствии с заданными критериями (скорость-объем памяти, как правило). В такой унивесральной арифметике делим хоть на 10, хоть на 100500 - какая разница. Особенно, если плавающая точка. Здесь мы говорим не об этом случае. Верно?
А есть программы, в которых нужно просто преобразовать целочисленный код в 2-10-е представление. По-моему, у ТС именно этот случай. А для чего используется такое преобразование, коллеги? Да для вывода в удобном человеку виде. Этот вывод нужен этому самому человеку не чаще, чем раз на пару сотен миллисекунд. То есть, это разовая операция на огромный (для любого МК) период времени! Никаких вхождений ее в длинную цепочку повторяющихся (зацикленных) вычислений речи нет. Тогда давайте себе ответим на вопрос: кого ипет ее быстродействие?
Я себе ответил лет 25 назад, что никого не ипет :) И я использовал отнимание во всех случаях, когда на морду прибора нужно было вывести понятное персоналу число. Наглядно, самому себе понятно (не забываем о сопровождении программ, мы в ответе за тех, кого мы создали), компактно и вполне быстро, пусть даже и не рекордно.
До сих пор живу в уверенности, что так и надо делать. Потому упрямо плюсую алгоритм имени Johmmy0007 :)
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.01.2013, 14:54 30
Цитата Сообщение от drvtos
Если я верно понял, то отнимание степеней 10 (назовем это алгоритмом Johmmy0007) ты не рассматривал на предмет сравнения? А было бы интересно.
Не рассматривался по причине не предсказуемости времени выполнения. Время выполнения этого метода зависит от значения аргумента. Задача стояла быстро поделить на 10 и приведен вариант на «С», иначе и вопроса не было бы. Давайте вычитать степени из 2^32, сколько уйдет времени?

Цитата Сообщение от drvtos
Но мой подход в данном случае таков: есть универсальные арифметики, которые строятся в соответствии с заданными критериями (скорость-объем памяти, как правило). В такой унивесральной арифметике делим хоть на 10, хоть на 100500 - какая разница. Особенно, если плавающая точка. Здесь мы говорим не об этом случае. Верно?
Согласен, но в условии делим на 10 аргумент «uint32_t»

Цитата Сообщение от drvtos
А есть программы, в которых нужно просто преобразовать целочисленный код в 2-10-е представление. По-моему, у ТС именно этот случай. А для чего используется такое преобразование, коллеги? Да для вывода в удобном человеку виде. Этот вывод нужен этому самому человеку не чаще, чем раз на пару сотен миллисекунд. То есть, это разовая операция на огромный (для любого МК) период времени! Никаких вхождений ее в длинную цепочку повторяющихся (зацикленных) вычислений речи нет. Тогда давайте себе ответим на вопрос: кого ипет ее быстродействие?
К сожалению, зачем ему это надо ТС не поведал, а по сему, совет типа «туалетной нет, возьмите нождачную» может оказаться не в теме. ТС хотел аналог на асме приведенного на «С» алгоритма – извольте, и он действительно быстрый.

Цитата Сообщение от drvtos
Потому упрямо плюсую алгоритм имени Johmmy0007 :)
Я использую методику из AVR200.

Для расчета тригонометрии можно использовать метод степенных рядов, получается вполне компактно, а в либах почему то табличный метод плюс интерполяция какого там порядка.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
11.01.2013, 17:12 31
Чтобы разговор поддержать :)

Цитата Сообщение от tyzord66
Давайте вычитать степени из 2^32, сколько уйдет времени?
.... в условии делим на 10 аргумент «uint32_t»
Ну, тут уж разное может быть. Например, берется 32-битное "с запасом". Я вот люблю целочисленную арифметику, так довольно часто при работе с обычными "измерительными" переменными (т.е. имеющими разрядность до 16 бит) объявляю ЛОНГи, ибо помножить-разделить удобно, не думая о разрядной сетке. А в конце концов, когда доходит до представления тому же человеку с его идиотской приверженностью к степеням десятки, реальное число и имеет битов до 16. Вот его прокрутить 4 раза (10000, 1000, 100 и 10) - плевое дело.
Да и 4,294,967,295 - 9 циклов. Я потому и спросил, пробовал ли ты. Самому-то влом проверять, но думаю, не более сотни микросекунд на АВР.

Цитата Сообщение от tyzord66
совет типа «туалетной нет, возьмите нождачную» может оказаться не в теме. ТС хотел аналог на асме приведенного на «С» алгоритма – извольте, и он действительно быстрый.
Да, мы тут все мастера на такие советы. Но бывает, что ТС и не догадывается о других подходах. Вот тогда "наждачная" вдруг и решает проблему :)

Цитата Сообщение от tyzord66
Для расчета тригонометрии можно использовать метод степенных рядов, получается вполне компактно, а в либах почему то табличный метод плюс интерполяция какого там порядка.
О, скока пришлось по математическим справочникам порыться! А Интернета не было... На самом деле алгоритмов - просто море! Выбор бывает мучительным. Я уж не помню, но кажется, корень квадратный был у меня каким-то очень необычным. Не с первой попытки, истесна...
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
11.01.2013, 19:56 32
кстати, если кому интересно голову поломать:
Микроконтроллеры. Это же просто! Фрунзе А.В. 2002. Том 3
-куча всяких математических алгоритмов, правда для x51
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.01.2013, 22:19 33
Цитата Сообщение от drvtos
Да и 4,294,967,295 - 9 циклов. Я потому и спросил, пробовал ли ты. Самому-то влом проверять, но думаю, не более сотни микросекунд на АВР.
Не придумал ничего лучше того, что под спойлером :). Длинна 55 КОПов время выполнения для 4,294,967,295(0xffffffff) – 1048 тактов, время работы тем больше, чем больше девяток в аргументе. Получилось дольше чем универсальное деление «сдвиг/вычитание» из AVR200. Может у кого то этот метод получится быстрей?
Код
;*****************************************************************
; IN(аргумент) = R19:R18:R17:R16
; OUT = R9:R8:R7:R6(целая часть) R16(остаток)
;***************************************************************** 18 words
razr_10:   .db      $00,$00,$00,$01      ;   1
.db      $00,$00,$00,$0a      ;   1*10^1
.db      $00,$00,$00,$64      ;   1*10^2
.db      $00,$00,$03,$E8      ;   1*10^3
.db      $00,$00,$27,$10      ;   1*10^4
.db      $00,$01,$86,$A0      ;   1*10^5
.db      $00,$0F,$42,$40      ;   1*10^6
.db      $00,$98,$96,$80      ;   1*10^7
.db      $05,$F5,$E1,$00      ;   1*10^8
.db      $3B,$9A,$CA,$00      ;   1*10^9
;----------------------------------------------------------------- 37 words
d10:      ldi      R21,   $4         ; шаг указателя
ldi      R20,   $9         ; ожидаемое число десятичных разрядов
clr      R6               ; очистка результата
clr      R7               ;   -"-
clr      R8               ;   -"-
clr      R9               ;   -"-
ves_next:   tst      R20
brne   d10_nex
ret
d10_nex:   dec      R20
ldi      ZL,      low(razr_10*2)
ldi      ZH,      high(razr_10*2)
mul      R20,R21
add      ZL,      R0
adc      ZH,      R1
;----- читаем коэффициент накопителя -----------------------------
lpm      R13,   Z+
lpm      R12,   Z+
lpm      R11,   Z+
lpm      R10,   Z+
;----- читаем вес разряда ----------------------------------------
lpm      R5,      Z+
lpm      R4,      Z+
lpm      R3,      Z+
lpm      R2,      Z+
ves_rpt:   sub      R16,   R2
sbc      R17,   R3
sbc      R18,   R4
sbc      R19,   R5
brcc   accum
add      R16,   R2
adc      R17,   R3
adc      R18,   R4
adc      R19,   R5
rjmp   ves_next
accum:      add      R6,      R10
adc      R7,      R11
adc      R8,      R12
adc      R9,      R13
rjmp   ves_rpt
;*****************************************************************
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
11.01.2013, 22:40 34
Цитата Сообщение от tyzord66
Цитата Сообщение от drvtos
Да и 4,294,967,295 - 9 циклов. Я потому и спросил, пробовал ли ты. Самому-то влом проверять, но думаю, не более сотни микросекунд на АВР.
Не придумал ничего лучше того, что под спойлером :). Длинна 55 КОПов время выполнения для 4,294,967,295(0xffffffff) – 1048 тактов, время работы тем больше, чем больше девяток в аргументе. Получилось дольше чем универсальное деление «сдвиг/вычитание» из AVR200. Может у кого то этот метод получится быстрей?Ну, куда уж быстрей... Я вообще асма авр не осваивал.
Но, давай посмотрим на то, что есть. Для нереально большого числа 4,294,967,295 получили 1000 тактов - это 50 мкс на 20 МГц? Неужто я так угадал... Или не так считать надо?
Ну, если я даже ошибаюсь. Тоже не слишком разочаровывает. Операция, которая (предположительно) работает раз на 200 мс (200000 мкс), займет не 50 мкс, а 100 или 200. От цикла - менее 0,1 %. Вполне сносно. А для чисел до 65К? Еще лучше. Я бы так и делал. Исключительно из-за наглядности метода. Хотя то, что ты написал, я не понимаю :)
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.01.2013, 23:00 35
Цитата Сообщение от drvtos
Для нереально большого числа 4,294,967,295 получили 1000 тактов - это 50 мкс на 20 МГц? Неужто я так угадал... Или не так считать надо?
Подставил число поменьше – 999.999.999, получилось 1288 тактов. При 256 – 508 тактов
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
11.01.2013, 23:12 36
Цитата Сообщение от drvtos
Операция, которая (предположительно) работает раз на 200 мс (200000 мкс), займет не 50 мкс, а 100 или 200. От цикла - менее 0,1 %. Вполне сносно.
Смотря где надо заюзать. Три волосины на голове это мало, в супе – много. :)
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
13.01.2013, 08:36 37
Прочитал, очень интересно.
Мне надо выводить на 3-х цифровой индикатор число пользователю.
В начале сделал вычитаниями 100,10,1, всё работает, но хочется же всегда чего то побыстрее.
Пользователю будет выводиться на индикатор время в процентах оставшегося заряда АКБ у велофары, либо время оставшееся.
http://www.youtube.com/watch?v=YvMnI_GQdGs
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
13.01.2013, 10:09 38
Цитата Сообщение от tyzord66
Цитата Сообщение от drvtos
Да и 4,294,967,295 - 9 циклов. Я потому и спросил, пробовал ли ты. Самому-то влом проверять, но думаю, не более сотни микросекунд на АВР.
Не придумал ничего лучше того, что под спойлером :). Длинна 55 КОПов время выполнения для 4,294,967,295(0xffffffff) – 1048 тактов, время работы тем больше, чем больше девяток в аргументе. Получилось дольше чем универсальное деление «сдвиг/вычитание» из AVR200. Может у кого то этот метод получится быстрей?
Код
;*****************************************************************
; IN(аргумент) = R19:R18:R17:R16
; OUT = R9:R8:R7:R6(целая часть) R16(остаток)
;***************************************************************** 18 words
razr_10:   .db      $00,$00,$00,$01      ;   1
.db      $00,$00,$00,$0a      ;   1*10^1
.db      $00,$00,$00,$64      ;   1*10^2
.db      $00,$00,$03,$E8      ;   1*10^3
.db      $00,$00,$27,$10      ;   1*10^4
.db      $00,$01,$86,$A0      ;   1*10^5
.db      $00,$0F,$42,$40      ;   1*10^6
.db      $00,$98,$96,$80      ;   1*10^7
.db      $05,$F5,$E1,$00      ;   1*10^8
.db      $3B,$9A,$CA,$00      ;   1*10^9
;----------------------------------------------------------------- 37 words
d10:      ldi      R21,   $4         ; шаг указателя
ldi      R20,   $9         ; ожидаемое число десятичных разрядов
clr      R6               ; очистка результата
clr      R7               ;   -"-
clr      R8               ;   -"-
clr      R9               ;   -"-
ves_next:   tst      R20
brne   d10_nex
ret
d10_nex:   dec      R20
ldi      ZL,      low(razr_10*2)
ldi      ZH,      high(razr_10*2)
mul      R20,R21
add      ZL,      R0
adc      ZH,      R1
;----- читаем коэффициент накопителя -----------------------------
lpm      R13,   Z+
lpm      R12,   Z+
lpm      R11,   Z+
lpm      R10,   Z+
;----- читаем вес разряда ----------------------------------------
lpm      R5,      Z+
lpm      R4,      Z+
lpm      R3,      Z+
lpm      R2,      Z+
ves_rpt:   sub      R16,   R2
sbc      R17,   R3
sbc      R18,   R4
sbc      R19,   R5
brcc   accum
add      R16,   R2
adc      R17,   R3
adc      R18,   R4
adc      R19,   R5
rjmp   ves_next
accum:      add      R6,      R10
adc      R7,      R11
adc      R8,      R12
adc      R9,      R13
rjmp   ves_rpt
;*****************************************************************
Это код можно сделать короче и, соответственно, быстрее.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
13.01.2013, 10:36 39
Цитата Сообщение от putmom
всё работает, но хочется же всегда чего то побыстрее.
Пользователю будет выводиться на индикатор время в процентах оставшегося заряда АКБ у велофары
Приделай электромоторчик, будет быстрее ехать :)
0
ptoop
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
13.01.2013, 10:54 40
В начале сделал вычитаниями 100,10,1, всё работает, но хочется же всегда чего то побыстрее.
Что-то я не пойму, вся эта байда для вывода на индикацию??? Да блин тут секунду считать можно, и обсчитать траекторию посадки на Луну за это время. Я то думал какой-нибудь мудрёный фильтр, или что-то подобное, где каждая микросекунда дорога...
0
13.01.2013, 10:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2013, 10:54

Деление на 0
Все говорят на 0 делить нельзя,но я поделил,в чем тут подвох #include &lt;iostream&gt; using...

Деление на 5
Дано число в шестнадцатеричной системе счисления. Число может быть очень большое. Требуется...

деление
подскажите. допустим в переменной типа string находится число 8192. требуется разделить это число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru