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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Применение целочисленной арифметики
Яrik
сообщение Feb 6 2007, 00:15
Сообщение #1


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

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Добрый вечер!

Для деления чисел с плавающей запятой необходимо много памяти МК. Но знаю, что эту операцию можно сделать, используя целочисленую арифметику.
Подскажите, пожалуйста, кто знает как обращаться с этим зверем. biggrin.gif
Go to the top of the page
 
+Quote Post
umup
сообщение Feb 6 2007, 00:28
Сообщение #2


Местный
***

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



очень просто - при вычислениях просто используйте целые числа, домноженные на нужное число 10ток после запятой, например для отбражения числа 1.4 с одним знаком после запятой получится 14, с двумя - 140. Ясно что при умножениях/делениях и других операциях это нужно учитывать, например 1.4 * 1.5 = 2.1, а 14 * 15 = 210, то есть после умножения нужно еще разделить на 10 чтобы получить 21
Go to the top of the page
 
+Quote Post
mihask
сообщение Feb 6 2007, 05:45
Сообщение #3


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

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(Яrik @ Feb 6 2007, 03:15) *
Добрый вечер!

Для деления чисел с плавающей запятой необходимо много памяти МК. Но знаю, что эту операцию можно сделать, используя целочисленую арифметику.
Подскажите, пожалуйста, кто знает как обращаться с этим зверем. biggrin.gif


Что-то мне кажется что одним делением не обойдется smile.gif, я конечно не знаю условий вашей задачи , но скорей всего придется всю математику или ,по крайней мере, наиболее ресурсоемкую часть перевести
на целочисленную арифметику, а то можно много потерять на преобразовании переменных из одного формата в другой. От себя добавлю пример со сложением smile.gif
1 + 0.35 =1.35 в целочисленном формате 100 + 35 =135 - подразумеваем что у нас два знака после
запятой. Деление - наиболее эффективно методом сдвига , так это помоему называется smile.gif, алгоритма не
помню, могу дать исходник функции целочисленного деления на asm 51- ого процессора smile.gif.
Кстати деление в столбик, которое здесь тоже можно применить, - это очень медленный вариант.

Эффективные алгоритмы целочисленного деления описаны в книге - "Алгоритмические трюки для программистов" - в сети можно скачать точно, если не удастся найти, могу дать.

Сообщение отредактировал mihask - Feb 6 2007, 06:02
Go to the top of the page
 
+Quote Post
umup
сообщение Feb 6 2007, 09:42
Сообщение #4


Местный
***

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



еще посмотрите на http://umup.narod.ru/#books_cs_arith - есть кое-что по комп.арифметике
Go to the top of the page
 
+Quote Post
gormih
сообщение Feb 6 2007, 09:49
Сообщение #5


nofb
***

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



Цитата(mihask @ Feb 6 2007, 03:15) *
Эффективные алгоритмы целочисленного деления описаны в книге - "Алгоритмические трюки для программистов" - , если не удастся найти, могу дать.


если можно вот сюда


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
Wild007
сообщение Feb 6 2007, 09:59
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



2 gormih здесь:
Алгоритмические трюки для программистов


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
mse
сообщение Feb 6 2007, 10:05
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(Яrik @ Feb 6 2007, 00:15) *
Добрый вечер!

Для деления чисел с плавающей запятой необходимо много памяти МК. Но знаю, что эту операцию можно сделать, используя целочисленую арифметику.
Подскажите, пожалуйста, кто знает как обращаться с этим зверем. biggrin.gif

Ничё не понял...чего это вдруг "много"? Плывучка, кстати, будет занимать "меньше" места и времени, по сравнению с аналогичной по динамицкому диапазону представления чисел, целочисленкой. Умножение-деление - в разы. Сложение-вычитание, разве что, проиграет. Тоже в разы. 5...8 тактов против 10-20-50.
Другое дело, если операнды реально укладываются в слово-два-три процессора. Тогда смысл есть.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 6 2007, 11:53
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(mse @ Feb 6 2007, 11:05) *
Ничё не понял...чего это вдруг "много"? Плывучка, кстати, будет занимать "меньше" места и времени, по сравнению с аналогичной по динамицкому диапазону представления чисел, целочисленкой. Умножение-деление - в разы. Сложение-вычитание, разве что, проиграет. Тоже в разы. 5...8 тактов против 10-20-50.
Другое дело, если операнды реально укладываются в слово-два-три процессора. Тогда смысл есть.


Совершенно согласен. Я это проверял. Единственное что усложняет работу с флоат это ввод/вывод в десятичной с.с. А сама арифметика просто прекрасно считается. Тем более у AVR команды есть соответствующие. Тоже применял.

Так что всё зависит от разрядности чисел и необходимости их отображения. А на счёт памяти не парьтесь - и регистрами обойдётесь.
Go to the top of the page
 
+Quote Post
Яrik
сообщение Feb 6 2007, 19:25
Сообщение #9


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

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Цитата
Единственное что усложняет работу с флоат это ввод/вывод в десятичной с.с


Да, да какраз это... Я думал, что используя целочисленную арифметику удастся уменьшить объем занимаемой програмой. Но теперь понял, что ошибался.
Я питался выводить на LCD результат измереного АЦП напряжения. В результате использования команды printf, объем памяти занимаемой программой сотавил 50% имеющейся в ATmega8.
Может кто поделится своими наработками? Зарание благодарю.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 7 2007, 03:21
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Но результат АЦП - целочисленный. blink.gif

Пожалуйста, если хотите получить полный ответ, задайте полный вопрос.
Go to the top of the page
 
+Quote Post
mse
сообщение Feb 7 2007, 09:50
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
lazycamel
сообщение Feb 7 2007, 17:02
Сообщение #12


Участник
*

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



Цитата(mse @ Feb 6 2007, 11:05) *
Плывучка, кстати, будет занимать "меньше" места и времени, по сравнению с аналогичной по динамицкому диапазону представления чисел, целочисленкой.


Обычный пример для плавучки - ATAN(ADC0/ADC1)*PI
ИМХО целочиcленка и CORDIC будут не просто в разы, а на порядок быстрее.
Go to the top of the page
 
+Quote Post
umup
сообщение Feb 7 2007, 17:08
Сообщение #13


Местный
***

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



я пользуюсь этим :

http://electronix.ru/forum/index.php?showt...mp;#entry188097

ilcd_ks066_pul(data, buf, options) - вывод беззнакового long с фиксированной точкой в память
ilcd_ks066_psl(data, buf, options) - вывод знакового long

а из памяти - на LCD
Go to the top of the page
 
+Quote Post
mse
сообщение Feb 7 2007, 17:31
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(lazycamel @ Feb 7 2007, 17:02) *
Обычный пример для плавучки - ATAN(ADC0/ADC1)*PI
ИМХО целочиcленка и CORDIC будут не просто в разы, а на порядок быстрее.

Обычный пример для плывучки: 0.000076538435*25484135е3
Без ИМХОв: плывучка оденет целочисленку, пусть не на порядок, но в разы.
На порядок она оденет при делении лонг-лонг на его-же.
И кто мешает реализовать ATAN() таблично? КОРДИК тихо удавится в сортире. Без разницы, целочисленно или вплавь. Тем более, непонятно, кто мне запретит реализовать его вплавь?
Не надо путать алгоритм с операндом.
Go to the top of the page
 
+Quote Post
Яrik
сообщение Feb 7 2007, 18:25
Сообщение #15


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

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Цитата
Пожалуйста, если хотите получить полный ответ, задайте полный вопрос.

Да, результат преобразования целое число (от 0 до 1023), но на LCD мне нужно вывести выраженый в вольтах. Для перевода внутреним опорним напряжением, я пользуюсь следующей формулой:Прикрепленное изображение
Go to the top of the page
 
+Quote Post

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

 


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


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