|
Применение целочисленной арифметики |
|
|
|
Feb 6 2007, 00:15
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Добрый вечер! Для деления чисел с плавающей запятой необходимо много памяти МК. Но знаю, что эту операцию можно сделать, используя целочисленую арифметику. Подскажите, пожалуйста, кто знает как обращаться с этим зверем.
|
|
|
|
|
Feb 6 2007, 05:45
|
Частый гость
 
Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905

|
Цитата(Яrik @ Feb 6 2007, 03:15)  Добрый вечер! Для деления чисел с плавающей запятой необходимо много памяти МК. Но знаю, что эту операцию можно сделать, используя целочисленую арифметику. Подскажите, пожалуйста, кто знает как обращаться с этим зверем.  Что-то мне кажется что одним делением не обойдется  , я конечно не знаю условий вашей задачи , но скорей всего придется всю математику или ,по крайней мере, наиболее ресурсоемкую часть перевести на целочисленную арифметику, а то можно много потерять на преобразовании переменных из одного формата в другой. От себя добавлю пример со сложением  1 + 0.35 =1.35 в целочисленном формате 100 + 35 =135 - подразумеваем что у нас два знака после запятой. Деление - наиболее эффективно методом сдвига , так это помоему называется  , алгоритма не помню, могу дать исходник функции целочисленного деления на asm 51- ого процессора  . Кстати деление в столбик, которое здесь тоже можно применить, - это очень медленный вариант. Эффективные алгоритмы целочисленного деления описаны в книге - "Алгоритмические трюки для программистов" - в сети можно скачать точно, если не удастся найти, могу дать.
Сообщение отредактировал mihask - Feb 6 2007, 06:02
|
|
|
|
|
Feb 6 2007, 09:49
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(mihask @ Feb 6 2007, 03:15)  Эффективные алгоритмы целочисленного деления описаны в книге - "Алгоритмические трюки для программистов" - , если не удастся найти, могу дать. если можно вот сюда
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Feb 6 2007, 10:05
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата(Яrik @ Feb 6 2007, 00:15)  Добрый вечер! Для деления чисел с плавающей запятой необходимо много памяти МК. Но знаю, что эту операцию можно сделать, используя целочисленую арифметику. Подскажите, пожалуйста, кто знает как обращаться с этим зверем.  Ничё не понял...чего это вдруг "много"? Плывучка, кстати, будет занимать "меньше" места и времени, по сравнению с аналогичной по динамицкому диапазону представления чисел, целочисленкой. Умножение-деление - в разы. Сложение-вычитание, разве что, проиграет. Тоже в разы. 5...8 тактов против 10-20-50. Другое дело, если операнды реально укладываются в слово-два-три процессора. Тогда смысл есть.
|
|
|
|
|
Feb 6 2007, 11:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(mse @ Feb 6 2007, 11:05)  Ничё не понял...чего это вдруг "много"? Плывучка, кстати, будет занимать "меньше" места и времени, по сравнению с аналогичной по динамицкому диапазону представления чисел, целочисленкой. Умножение-деление - в разы. Сложение-вычитание, разве что, проиграет. Тоже в разы. 5...8 тактов против 10-20-50. Другое дело, если операнды реально укладываются в слово-два-три процессора. Тогда смысл есть. Совершенно согласен. Я это проверял. Единственное что усложняет работу с флоат это ввод/вывод в десятичной с.с. А сама арифметика просто прекрасно считается. Тем более у AVR команды есть соответствующие. Тоже применял. Так что всё зависит от разрядности чисел и необходимости их отображения. А на счёт памяти не парьтесь - и регистрами обойдётесь.
|
|
|
|
|
Feb 6 2007, 19:25
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Цитата Единственное что усложняет работу с флоат это ввод/вывод в десятичной с.с Да, да какраз это... Я думал, что используя целочисленную арифметику удастся уменьшить объем занимаемой програмой. Но теперь понял, что ошибался. Я питался выводить на LCD результат измереного АЦП напряжения. В результате использования команды printf, объем памяти занимаемой программой сотавил 50% имеющейся в ATmega8. Может кто поделится своими наработками? Зарание благодарю.
|
|
|
|
|
Feb 7 2007, 09:50
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата(Яrik @ Feb 6 2007, 19:25)  Цитата Единственное что усложняет работу с флоат это ввод/вывод в десятичной с.с Да, да какраз это... Я думал, что используя целочисленную арифметику удастся уменьшить объем занимаемой програмой. Но теперь понял, что ошибался. Я питался выводить на LCD результат измереного АЦП напряжения. В результате использования команды printf, объем памяти занимаемой программой сотавил 50% имеющейся в ATmega8. Может кто поделится своими наработками? Зарание благодарю. http://www.telesys.ru/wwwboards/mcontrol/2...es/141026.shtmlсразу в АSCII http://www.telesys.ru/wwwboards/mcontrol/2...es/141922.shtml
|
|
|
|
|
Feb 7 2007, 17:02
|
Участник

Группа: Свой
Сообщений: 48
Регистрация: 5-11-04
Пользователь №: 1 053

|
Цитата(mse @ Feb 6 2007, 11:05)  Плывучка, кстати, будет занимать "меньше" места и времени, по сравнению с аналогичной по динамицкому диапазону представления чисел, целочисленкой. Обычный пример для плавучки - ATAN(ADC0/ADC1)*PI ИМХО целочиcленка и CORDIC будут не просто в разы, а на порядок быстрее.
|
|
|
|
|
Feb 7 2007, 17:08
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720

|
я пользуюсь этим : http://electronix.ru/forum/index.php?showt...mp;#entry188097ilcd_ks066_pul(data, buf, options) - вывод беззнакового long с фиксированной точкой в память ilcd_ks066_psl(data, buf, options) - вывод знакового long а из памяти - на LCD
|
|
|
|
|
Feb 7 2007, 17:31
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата(lazycamel @ Feb 7 2007, 17:02)  Обычный пример для плавучки - ATAN(ADC0/ADC1)*PI ИМХО целочиcленка и CORDIC будут не просто в разы, а на порядок быстрее. Обычный пример для плывучки: 0.000076538435*25484135е3 Без ИМХОв: плывучка оденет целочисленку, пусть не на порядок, но в разы. На порядок она оденет при делении лонг-лонг на его-же. И кто мешает реализовать ATAN() таблично? КОРДИК тихо удавится в сортире. Без разницы, целочисленно или вплавь. Тем более, непонятно, кто мне запретит реализовать его вплавь? Не надо путать алгоритм с операндом.
|
|
|
|
|
Feb 7 2007, 18:25
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Цитата Пожалуйста, если хотите получить полный ответ, задайте полный вопрос. Да, результат преобразования целое число (от 0 до 1023), но на LCD мне нужно вывести выраженый в вольтах. Для перевода внутреним опорним напряжением, я пользуюсь следующей формулой:
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|