|
|
|
Операции над большими числами, Операции над большими числами |
|
|
|
Mar 8 2010, 20:41
|
Частый гость
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117
|
Цитата(rx3apf @ Mar 8 2010, 23:39) Или плавучку делать, или изначально умножить делимое на двойку соответствующей степени, таким образом, чтобы после всех делений результат оставался целым с требуемой точностью. Не очень понимаю как это должно выглядеть??
|
|
|
|
|
Mar 8 2010, 21:59
|
Частый гость
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117
|
Цитата(rx3apf @ Mar 9 2010, 00:19) Должным образом масштабируя исходные данные, можно работать с дробными числами с помощью простой целочисленной арифметики. Ну, а если нужно что-то серьезное - тогда делать плавучку... А где бы об этом почитать?? Не очень понятно как возникает степень 2, от чего я отталкиваюсь?? Мою задачу можно решить подобным образом??
Сообщение отредактировал NickSmith - Mar 8 2010, 22:00
|
|
|
|
|
Mar 8 2010, 22:52
|
Гуру
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 9 2010, 10:01
|
Частый гость
Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117
|
Цитата(rx3apf @ Mar 9 2010, 01:52) Почему нет ? Простая арифметика, надо просто прикинуть требуемые разрядности, превратить простым умножением на константу (2 в подходящей степени) все дробные значения в целые и с ними работать. А я думаю, а если как то сократить мою формулу.. Она рассчитана на 4 байтовые числа, в моем же случае результат в основном двухбайтовый.. Я не могу сообразить, с какой стороны к этому подходить?? Еще как вариант, увеличение и уменьшение уже готового числа, но дело в том, что шаг как я пронаблюдал всегда разный. Иногда на два а иногда и на пять.. Это нужно какой то анализ проводить.. По моему проще вычислять по формуле нужное значение..
|
|
|
|
|
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
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|