|
деление до сотых, на Си для 8-битного микроконтрллера |
|
|
|
Feb 19 2010, 11:21
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(another_one @ Feb 19 2010, 14:11)  Можно ли целую величину поделить например на 1.66 Если хотите выполнить вычисления в целых, то умножьте на 3, затем поделите на 5. Цитата(another_one @ Feb 19 2010, 14:11)  можно ли как-нибудь вещественным рельтатом оперировать в качестве содержимым регистра таймера? Как-нибудь да можно. Вопрос уточните.
|
|
|
|
|
Feb 19 2010, 12:00
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(another_one @ Feb 19 2010, 14:51)  Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора. float f2 = (float)f1 / 1.66; Это если время есть. Если нет - то как сказали ранее f2 = f1 * 3 / 5;
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Feb 19 2010, 14:43
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(another_one @ Feb 19 2010, 15:51)  Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора. Проблемы не в 8-разрядным контроллере или IARе, а в Вашей голове Поточнее поделить можно только смещая "фиксированную точку" Например a=b*50/3
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 19 2010, 15:57
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Dog Pawlowa @ Feb 19 2010, 19:43)  Поточнее поделить можно только смещая "фиксированную точку" Например a=b*50/3 Нет. Деление нужно заменить умножением. Деление на 1,66=166/100 эквивалентно умножению на обратную дробь 100/166=0,6024096. При целочисленном умножении точность не уменьшается. Ошибка возникает при целочисленном делении. Вот ее и нужно оценить. Для упрощения (и ускорения) целочисленного деления оно заменяется сдвигами, которые эквивалентны делению на 2^N. Соответственно исходную дробь нужно заранее умножить на 2^N так, чтобы с одной стороны не превысить разрядную сетку вычислений после умножения, а с другой стороны, чтобы обеспечить требуемую точность приближения дроби. Если исходное целое число 16-и разрядное, а вычисления ведутся в 32-х битной арифметике, то можно домножить на 2^16=65536. Тогда получается "магическое" число 39480 (39480/65536=0,602417). Исходное 16-и разрядное число умножаем на 39480, а затем делаем сдвиг результата умножения вправо на 16 разрядов. Погрешность при таком целочисленном делении получается меньше 0,0015%.
|
|
|
|
|
Feb 20 2010, 07:09
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(rezident @ Feb 19 2010, 18:57)  Тогда получается "магическое" число 39480 (39480/65536=0,602417). Исходное 16-и разрядное число умножаем на 39480, а затем делаем сдвиг результата умножения вправо на 16 разрядов. Кстати тема "магических" чисел уже, кажется, звучала на сахаре. Может автору топика будет полезно там покопаться
Сообщение отредактировал rezident - Feb 20 2010, 16:03
Причина редактирования: Нарушение п.3.4 Правил форума.
|
|
|
|
|
Feb 20 2010, 11:37
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(ASN @ Feb 20 2010, 12:22)  another_one А почему нельзя сразу частоту таймера поделить на 1.66 при измерении? Значение таймера будет уже готовое для использования. Начнем с того, что тем способом, о котором Вы писали, Вы измеряете не частоту, а период. А относительно того, как действовать дальше Вам достаточно подробно ответили. Ибо других подробностей Вашей задачи нам неизвестно.
|
|
|
|
|
Feb 21 2010, 05:23
|

Местный
  
Группа: Участник
Сообщений: 252
Регистрация: 2-03-08
Пользователь №: 35 557

|
Всем большое спасибо за поддержку Цитата Какой разрядности целые числа на входе и выходе? Коэффициент деления фиксированный (1,66) или произвольный? С какой точностью нужно получить результат деления? Планирую использовать 2 16-битных таймера(вход, выход), коэффициент деления фиксированый, точность до 100-х
--------------------
One Chip is All You Need
|
|
|
|
|
Feb 21 2010, 06:49
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(another_one @ Feb 21 2010, 08:23)  точность до 100-х Еще раз - как вы понимаете точность? До сотых - чего сотых?! Или Вы не можете перевести в код то, что rezident написал? timer2 = (unsigned int)(((unsigned long)timer1*39480L)>>16);
--------------------
Уходя, оставьте свет...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|