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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Операции над большими числами, Операции над большими числами
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
rx3apf
сообщение Mar 8 2010, 20:39
Сообщение #2


Гуру
******

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



Цитата(NickSmith @ Mar 8 2010, 23:23) *
Подскажите, как бы все это реализовать??

Или плавучку делать, или изначально умножить делимое на двойку соответствующей степени, таким образом, чтобы после всех делений результат оставался целым с требуемой точностью.
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 8 2010, 20:41
Сообщение #3


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

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



Цитата(rx3apf @ Mar 8 2010, 23:39) *
Или плавучку делать, или изначально умножить делимое на двойку соответствующей степени, таким образом, чтобы после всех делений результат оставался целым с требуемой точностью.

Не очень понимаю как это должно выглядеть??
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 8 2010, 21:19
Сообщение #4


Гуру
******

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



Цитата(NickSmith @ Mar 8 2010, 23:41) *
Не очень понимаю как это должно выглядеть??

Нужно поделить 5050 на 1000 без потери значимости ? Множим 5050 на 2^10 (5171200, или 4EE800 hex), полученное число делим на 1000. Получилось 5171. Однако результат только выглядит как целое число, а на самом деле это дробное значение 5.0498, в формате 6.10 (двоичных разрядов). Должным образом масштабируя исходные данные, можно работать с дробными числами с помощью простой целочисленной арифметики. Ну, а если нужно что-то серьезное - тогда делать плавучку...
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 8 2010, 21:59
Сообщение #5


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

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



Цитата(rx3apf @ Mar 9 2010, 00:19) *
Должным образом масштабируя исходные данные, можно работать с дробными числами с помощью простой целочисленной арифметики. Ну, а если нужно что-то серьезное - тогда делать плавучку...

А где бы об этом почитать?? Не очень понятно как возникает степень 2, от чего я отталкиваюсь??
Мою задачу можно решить подобным образом??

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


Гуру
******

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



Цитата(NickSmith @ Mar 9 2010, 00:59) *
А где бы об этом почитать?? Не очень понятно как возникает степень 2, от чего я отталкиваюсь??

Степень двойки выбирается, исходя из требуемой разрядности и точности промежуточных и окончательного результата. В моем примере можно было бы взять не 2^10, а, скажем, 2^12, тогда результат был бы 20684, это было бы то же самое число 5.0498, но в формате 4.12. Однако результат округлен неправильно (взята только целая часть), поэтому точности это не прибавило. Надо бы взять 2^13, а после деления на 1000 еще поделить на 2 простым сдвигом и округлить (это проще, чем проверять остаток от деления). И результат станет 5.0500 (в формате 4.12). Где почитать - так вот сейчас не подскажу, кажется, я в это вникал по каким-то аппликухам к MSP430 (много лет прошло, уж не помню).
Цитата
Мою задачу можно решить подобным образом??

Почему нет ? Простая арифметика, надо просто прикинуть требуемые разрядности, превратить простым умножением на константу (2 в подходящей степени) все дробные значения в целые и с ними работать.

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


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

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



Цитата(rx3apf @ Mar 9 2010, 01:52) *
Почему нет ? Простая арифметика, надо просто прикинуть требуемые разрядности, превратить простым умножением на константу (2 в подходящей степени) все дробные значения в целые и с ними работать.

А я думаю, а если как то сократить мою формулу.. Она рассчитана на 4 байтовые числа, в моем же случае результат в основном двухбайтовый.. Я не могу сообразить, с какой стороны к этому подходить??
Еще как вариант, увеличение и уменьшение уже готового числа, но дело в том, что шаг как я пронаблюдал всегда разный. Иногда на два а иногда и на пять.. Это нужно какой то анализ проводить.. По моему проще вычислять по формуле нужное значение..
Go to the top of the page
 
+Quote Post
cant
сообщение Mar 9 2010, 11:04
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 216
Регистрация: 28-10-08
Из: Брест
Пользователь №: 41 243



Вам нужно не числа сокращать, а формулу. Тобишь оптимизировать вычисления.

Гуглите в сторону чисел с фиксированной запятой, про что Вам rx3apf и говорит
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 9 2010, 12:28
Сообщение #9


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
Сообщение #10


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

Группа: Участник
Сообщений: 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
Сообщение #11


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
Сообщение #12


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

Группа: Участник
Сообщений: 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
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 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
Сообщение #14


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

Группа: Участник
Сообщений: 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
Сообщение #15


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

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

 


RSS Текстовая версия Сейчас: 11th June 2024 - 11:30
Рейтинг@Mail.ru


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