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

 
 
> Операции над большими числами, Операции над большими числами
NickSmith
сообщение Mar 8 2010, 20:23
Сообщение #1


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Для программирования DDS синтезатора, мне надо вычислять код частоты..
Исходные:
Есть константа в виде 5050. Далее мне нужно эту константу разделить на 1000 затем полученный результат разделить на 1 умноженную на 2^28
У полученного результата то что будет после запятой округлить в большую сторону..
Как все это выполнить на асме?? Я нашел только стандартные процедуры деления, которые описаны в апнотах. Но у них нет деления для нецелых числе. Точней только для 1 байтных чисел есть..

Подскажите, как бы все это реализовать??
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение Mar 9 2010, 12:28
Сообщение #2


Ambidexter
*****

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



Цитата(NickSmith @ Mar 8 2010, 20:23) *
Есть константа в виде 5050. Далее мне нужно эту константу разделить на 1000 затем полученный результат разделить на 1 умноженную на 2^28. У полученного результата то что будет после запятой округлить в большую сторону.

Поточнее определите, что вам нужно. Следуя вашей формуле, вы получите значение (5050/1000)/2^28=1.88127Е-8, по-моему это не то число, которое вы ожидали.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 9 2010, 13:07
Сообщение #3


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(=GM= @ Mar 9 2010, 15:28) *
Поточнее определите, что вам нужно. Следуя вашей формуле, вы получите значение (5050/1000)/2^28=1.88127Е-8, по-моему это не то число, которое вы ожидали.

Действительно ошибся. Не на 1000 а на 100.
Получится 13555,99053
а если округлить то 13556 в шестнадцатеричном будет 34F4

Сообщение отредактировал NickSmith - Mar 9 2010, 13:10
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 9 2010, 17:21
Сообщение #4


Ambidexter
*****

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



Как вы вычисляете-то? Что ж из вас ответы клещами приходится тянуть!


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 9 2010, 18:45
Сообщение #5


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(=GM= @ Mar 9 2010, 20:21) *
Как вы вычисляете-то? Что ж из вас ответы клещами приходится тянуть!

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

Цитата(=GM= @ Mar 9 2010, 15:28) *
Поточнее определите, что вам нужно. Следуя вашей формуле, вы получите значение (5050/1000)/2^28=1.88127Е-8, по-моему это не то число, которое вы ожидали.

И опять я ошибся

Правильно это будет выглядеть так:
(5050/10^8)/1*2^28
Если это делать без единицы, то получается ерунда почему то..
формула выглядит так
Значение регистра = выходная частота в мегагерцах/ частота тактового генератора в мегагерцах*2^28

У меня же частоты в герцах и получается буквально одно слово..
Частота тактового генератора в а моем случае 1 мегагерц

Сообщение отредактировал NickSmith - Mar 9 2010, 19:04
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 9 2010, 19:24
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(NickSmith @ Mar 9 2010, 21:45) *
И опять я ошибся

Правильно это будет выглядеть так:
(5050/10^8)/1*2^28
Если это делать без единицы, то получается ерунда почему то..

А "с единицей" - так не просто ерунда, а вообще просто форменный бред, поскольку практического смысла умножение не единицу не имеет. Приведенная формула тоже никуда не годится - все ж в регистр синтезатора загружают целое число, а тут в любом случае дробное (и очень маленькое). Короче, разбирайтесь с математикой, и лишь потом - с переложением _правильных_ формул в их реализацию для микроконтроллера...
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 9 2010, 19:57
Сообщение #7


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(rx3apf @ Mar 9 2010, 22:24) *
А "с единицей" - так не просто ерунда, а вообще просто форменный бред, поскольку практического смысла умножение не единицу не имеет. Приведенная формула тоже никуда не годится - все ж в регистр синтезатора загружают целое число, а тут в любом случае дробное (и очень маленькое). Короче, разбирайтесь с математикой, и лишь потом - с переложением _правильных_ формул в их реализацию для микроконтроллера...

Ну да целое число. То, что после запятой округляется или в большую или в меньшую сторону...
Я думаю так сделать:
я храню значение в виде 5050, на самом деле это для формулы должно быть 10^-8 т.е я могу 5050/1*2^28 полученный результат разделить на 10^8..
Но тут возникают вопросы, как мне округлить числа после запятой??
И может быть как то можно это все сократить??

Я тоже так подумал, что с 1 единицей что без нее разницы нет.. Но вот попробуйте в экселе это сделать без нее.. Тогда действительно бред

Сообщение отредактировал NickSmith - Mar 9 2010, 20:02
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 9 2010, 20:29
Сообщение #8


Ambidexter
*****

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



Правильно так: (5050/10^8)*2^28 =0x13BA0000000/0x5F5E100=0x34F4=13556


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 9 2010, 21:25
Сообщение #9


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(=GM= @ Mar 9 2010, 23:29) *
Правильно так: (5050/10^8)*2^28 =0x13BA0000000/0x5F5E100=0x34F4=13556

А я вот тут подумал, а если подойти к задаче с дугой стороны.
Я посмотрел, что прибавление или вычитание из кода идет с шагом или 2 или 3.
Закономерность вроде как тоже есть.. Изменение на 2 происходит после двух подряд изменений на три и так пять раз, после чего три раза подряд изменение на три и цикл снова..
2333 233 233 233 233 233 23332......
Может быть по такому пути проще идти и не городить огород со сложной математикой..
Только как бы это привязать к какому либо значению?? Или придется тупо на каких то хитрых циклах делать??

Сообщение отредактировал NickSmith - Mar 9 2010, 21:26
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 9 2010, 21:31
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(NickSmith @ Mar 10 2010, 00:25) *
Только как бы это привязать к какому либо значению?? Или придется тупо на каких то хитрых циклах делать??

Фигней не надо заниматься, а ? Всего-то нужно тривиальное деление 40 / 20 битов. Простейший цикл сдвиг-сравнение-вычитание.
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 9 2010, 21:33
Сообщение #11


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(rx3apf @ Mar 10 2010, 00:31) *
Фигней не надо заниматься, а ? Всего-то нужно тривиальное деление 40 / 20 битов. Простейший цикл сдвиг-сравнение-вычитание.

А по подробней можно??
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 9 2010, 22:55
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(NickSmith @ Mar 10 2010, 00:33) *
А по подробней можно??

Ну как делается деление "столбиком" ? Так и здесь - сдвигаем делимое в накопитель остатка, сравниваем остаток с делимым, если больше либо равен - вычитаем делимое из остатка и записываем "1" в результат. Иначе не вычитаем и записываем "0". Для удобства регистр делителя и результата совмещается, по окончанию операции частное будет в том же накопителе. Реализации под конкретную платформу - практически всегда есть в аппликухах...
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 9 2010, 23:03
Сообщение #13


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(rx3apf @ Mar 10 2010, 01:55) *
Ну как делается деление "столбиком" ? Так и здесь - сдвигаем делимое в накопитель остатка, сравниваем остаток с делимым, если больше либо равен - вычитаем делимое из остатка и записываем "1" в результат. Иначе не вычитаем и записываем "0". Для удобства регистр делителя и результата совмещается, по окончанию операции частное будет в том же накопителе. Реализации под конкретную платформу - практически всегда есть в аппликухах...

Т.е делать все по формуле..
Хорошо, а как быт с округлением результатов? у меня же ведь на выходе получается число с запятой.. А в демо программе, как я понял результат расчетов округляется или в большую или в меньшую сторону?
Как поделить и умножить я разберусь, а вот как быть с остатком..
Я делаю это на tiny2313 там есть пример математики с большими числами.. Но он очень громоздок.. Что то строк под 150 по моему.. По этому я и подумал пойти простым путем и поиграть с увеличением или уменьшением готовой константы.. Кода по моему всяко меньше получится??
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 10 2010, 07:44
Сообщение #14


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(NickSmith @ Mar 10 2010, 02:03) *
Т.е делать все по формуле..
Хорошо, а как быт с округлением результатов? у меня же ведь на выходе получается число с запятой.. А в демо программе, как я понял результат расчетов округляется или в большую или в меньшую сторону?
Как поделить и умножить я разберусь, а вот как быть с остатком..

Я уже говорил, как это сделать проще. Делимое взять вдвое больше, а после деления частное еще раз поделить вдвое простым сдвигом и по состоянию бита переноса добавить единичку к результату.
Цитата
Я делаю это на tiny2313 там есть пример математики с большими числами.. Но он очень громоздок.. Что то строк под 150 по моему..

Жуть какая... Вот деление 32 / 16. Добавить по одному регистру в делимое, частное и остаток, будет требуемые 40 / 24...
CODE

;----------------------------------------------------------------------
; Деление XH:XL:YH:YL / ZH:ZL
; Используются регистры r0, r1, temp
;----------------------------------------------------------------------

Div32:
clr r0
clr r1
ldi temp,32 ; счетчик
Div32_1:
lsl YL
rol YH
rol XL
rol XH ; сдвиг делимого
rol r1
rol r0 ; и остатка (r0:r1)
cp r1,ZL
cpc r0,ZH ; можно вычесть делитель ?
brlo Div32_2 ; нет
ori YL,$01 ; иначе "1" в частное
sub r1,ZL
sbc r0,ZH
Div32_2:
dec temp
brne Div32_1 ; цикл деления

; В XH:XL:YH:YL содержится результат деления

ret
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 10 2010, 10:48
Сообщение #15


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(rx3apf @ Mar 10 2010, 10:44) *
Я уже говорил, как это сделать проще. Делимое взять вдвое больше, а после деления частное еще раз поделить вдвое простым сдвигом и по состоянию бита переноса добавить единичку к результату.

Жуть какая... Вот деление 32 / 16. Добавить по одному регистру в делимое, частное и остаток, будет требуемые 40 / 24...

Огромное спасибо за пример..
Но я все равно под запутался. Выше писали:
Цитата
Правильно так: (5050/10^8)*2^28 =0x13BA 0000 000/0x5F5E100=0x34F4=13556

Но получается не 0x34F4, 0x34F3
Вот если взять делимое на 1 ноль больше, то результат будет 0x34f3f
Если младшую тетраду младшего байта как то обрабатывать по условию, то и получится округление.. Прав??
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 10 2010, 10:56
Сообщение #16


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(NickSmith @ Mar 10 2010, 13:48) *
Но получается не 0x34F4, 0x34F3
Вот если взять делимое на 1 ноль больше, то результат будет 0x34f3f
Если младшую тетраду младшего байта как то обрабатывать по условию, то и получится округление.. Прав??

Мать-перемать... Ну сколько можно объяснять ? Надо взять делимое вдвое больше (умножить на 2^29), а потом частное поделить еще на 2 сдвигом вправо, и по состоянию переноса прибавить или не прибавляь 1 (т.е. для avr сделать adc. Для приведенной мной программы - lsr xh ror xl ror yh ror yl adc yl,temp adc yh,temp adc xl,temp adc xh temp). Конеччно, это можно сделать и контролем остатка, но так - проще. Естественно, в примере с конкретными числами разрядность можно сократить на 8 битов, поэтому достаточно деление 40 / 24.

Сообщение отредактировал rx3apf - Mar 10 2010, 10:57
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 10 2010, 11:01
Сообщение #17


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

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(rx3apf @ Mar 10 2010, 13:56) *
Мать-перемать... Ну сколько можно объяснять ? Надо взять делимое вдвое больше (умножить на 2^29), а потом частное поделить еще на 2 сдвигом вправо, и по состоянию переноса прибавить или не прибавляь 1 (т.е. для avr сделать adc. Для приведенной мной программы - lsr xh ror xl ror yh ror yl adc yl,temp adc yh,temp adc xl,temp adc xh temp). Конеччно, это можно сделать и контролем остатка, но так - проще. Естественно, в примере с конкретными числами разрядность можно сократить на 8 битов, поэтому достаточно деление 40 / 24.

Все, теперь понял ход вашей мысли..
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- NickSmith   Операции над большими числами   Mar 8 2010, 20:23
- - rx3apf   Цитата(NickSmith @ Mar 8 2010, 23:23) Под...   Mar 8 2010, 20:39
|- - NickSmith   Цитата(rx3apf @ Mar 8 2010, 23:39) Или пл...   Mar 8 2010, 20:41
|- - rx3apf   Цитата(NickSmith @ Mar 8 2010, 23:41) Не ...   Mar 8 2010, 21:19
|- - NickSmith   Цитата(rx3apf @ Mar 9 2010, 00:19) Должны...   Mar 8 2010, 21:59
|- - rx3apf   Цитата(NickSmith @ Mar 9 2010, 00:59) А г...   Mar 8 2010, 22:52
|- - NickSmith   Цитата(rx3apf @ Mar 9 2010, 01:52) Почему...   Mar 9 2010, 10:01
- - cant   Вам нужно не числа сокращать, а формулу. Тобишь оп...   Mar 9 2010, 11:04
|- - ae_   Цитата(NickSmith @ Mar 10 2010, 19:01) Вс...   Mar 10 2010, 15:14
|- - NickSmith   Цитата(ae_ @ Mar 10 2010, 18:14) Если я п...   Mar 10 2010, 17:12
|- - ae_   Цитата(NickSmith @ Mar 11 2010, 01:12) Из...   Mar 10 2010, 17:27
- - _Pasha   ЦитатаПриближение действительного числа рациональ...   Mar 10 2010, 01:09
- - Genadi Zawidowski   Цитатаtiny2313 Взяли бы мегу восьмую и писали на W...   Mar 10 2010, 06:10
- - NickSmith   С одним вроде как все понятно теперь, но вот тепер...   Mar 10 2010, 19:44
|- - rezident   Цитата(NickSmith @ Mar 11 2010, 00:44) Чт...   Mar 10 2010, 22:49
|- - NickSmith   Цитата(rezident @ Mar 11 2010, 01:49) Дык...   Mar 11 2010, 00:00
- - NickSmith   Что то не получается у меня переделать умножение и...   Mar 11 2010, 23:52
|- - rx3apf   Цитата(NickSmith @ Mar 12 2010, 02:52) Чт...   Mar 12 2010, 14:03
- - NickSmith   Пробовал менять местами множимое и множитель с доб...   Mar 12 2010, 11:17
|- - =GM=   Поменяйте порядок сдвига, как показано ниже, и буд...   Mar 12 2010, 13:31
|- - NickSmith   Цитата(=GM= @ Mar 12 2010, 16:31) На буду...   Mar 13 2010, 10:10
|- - rx3apf   Цитата(NickSmith @ Mar 13 2010, 13:10) Я ...   Mar 13 2010, 10:28
|- - NickSmith   Цитата(rx3apf @ Mar 13 2010, 13:28) Ну то...   Mar 13 2010, 11:09
|- - rx3apf   Цитата(NickSmith @ Mar 13 2010, 14:09) Я ...   Mar 13 2010, 11:18
|- - NickSmith   Цитата(rx3apf @ Mar 13 2010, 14:18) Да та...   Mar 13 2010, 11:31
- - NickSmith   Имеется формула код фазы = ( a*b )/c где а =знач...   Mar 14 2010, 10:12
- - ae_   Цитата(NickSmith @ Mar 14 2010, 18:12) Им...   Mar 14 2010, 15:25
- - NickSmith   Цитата(ae_ @ Mar 14 2010, 18:25) Далее, н...   Mar 14 2010, 23:05
- - ae_   Цитата(NickSmith @ Mar 15 2010, 07:05) Ог...   Mar 15 2010, 00:21
- - rezident   Цитата(NickSmith @ Mar 15 2010, 04:05) А ...   Mar 15 2010, 00:23


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 12:22
Рейтинг@Mail.ru


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