|
Операции над большими числами, Операции над большими числами |
|
|
|
 |
Ответов
|
Mar 9 2010, 13:07
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 9 2010, 18:45
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 9 2010, 19:57
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 9 2010, 21:25
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 9 2010, 21:33
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(rx3apf @ Mar 10 2010, 00:31)  Фигней не надо заниматься, а ? Всего-то нужно тривиальное деление 40 / 20 битов. Простейший цикл сдвиг-сравнение-вычитание. А по подробней можно??
|
|
|
|
|
Mar 9 2010, 23:03
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117

|
Цитата(rx3apf @ Mar 10 2010, 01:55)  Ну как делается деление "столбиком" ? Так и здесь - сдвигаем делимое в накопитель остатка, сравниваем остаток с делимым, если больше либо равен - вычитаем делимое из остатка и записываем "1" в результат. Иначе не вычитаем и записываем "0". Для удобства регистр делителя и результата совмещается, по окончанию операции частное будет в том же накопителе. Реализации под конкретную платформу - практически всегда есть в аппликухах... Т.е делать все по формуле.. Хорошо, а как быт с округлением результатов? у меня же ведь на выходе получается число с запятой.. А в демо программе, как я понял результат расчетов округляется или в большую или в меньшую сторону? Как поделить и умножить я разберусь, а вот как быть с остатком.. Я делаю это на tiny2313 там есть пример математики с большими числами.. Но он очень громоздок.. Что то строк под 150 по моему.. По этому я и подумал пойти простым путем и поиграть с увеличением или уменьшением готовой константы.. Кода по моему всяко меньше получится??
|
|
|
|
|
Mar 10 2010, 07:44
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 10 2010, 10:48
|
Частый гость
 
Группа: Участник
Сообщений: 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 Если младшую тетраду младшего байта как то обрабатывать по условию, то и получится округление.. Прав??
|
|
|
|
|
Mar 10 2010, 10:56
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 10 2010, 11:01
|
Частый гость
 
Группа: Участник
Сообщений: 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. Все, теперь понял ход вашей мысли..
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|