Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/138: Рейтинг темы: голосов - 138, средняя оценка - 4.83
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
1

Деление на 10.

09.01.2013, 10:03. Просмотров 25309. Ответов 67
Метки нет (Все метки)

Нашел тут статейку по методам деления на 10 (http://we.iosyitistromyss.ru/Soft/pr...ye-chisla.html).
Заинтересовал метод сдвигами и сложениями.
Цитирую:
Код:
struct divmod10_t
{
uint32_t quot;
uint8_t rem;
};
inline static divmod10_t divmodu10(uint32_t n)
{
divmod10_t res;
// умножаем на 0.8
res.quot = n >> 1;
res.quot += res.quot >> 1;
res.quot += res.quot >> 4;
res.quot += res.quot >> 8;
res.quot += res.quot >> 16;
uint32_t qq = res.quot;
// делим на 8
res.quot >>= 3;
// вычисляем остаток
res.rem = uint8_t(n - ((res.quot << 1) + (qq & ~7ul)));
// корректируем остаток и частное
if(res.rem > 9)
{
res.rem -= 10;
res.quot++;
}
return res;
}

Выглядит страшно и непонятно, но на самом деле всё просто. Сначала умножаем исходное число на 0.8 или 0.1100 1100 1100 1100 1100 1100 1100 1100 в двоичном представлении. Очень удобно, что дробь периодическая и удалось обойтись всего пятью сдвигами и четырьмя сложениями. Далее делим то, что получилось на 8, сдвигая на 3 разряда вправо. Получается исходное число делённое на 10 с точностью до единицы из-за ошибок округления.

Сижу и не понимаю, как всё таки на 0.8 умножать ? Какие то сдвиги вижу в коде, но Си не понимаю =(
Разжуйте пожалуйста как на ассемблере умножить на 0.8.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2013, 10:03
Ответы с готовыми решениями:

Задача про деление яблок (целочисленное деление)
Ребят,помогите с задачкой,как написать input.txt и output.txt? Помогите решить задачу. C++....

Умножение, деление и деление с остатком
Рассмотрим эти операции на примере. static void Main() { int i = 100, j = 15; double a =...

Деление знаковых чисел с выводом ошибки "Деление на ноль"
Собственно поставили передо мной задачу - написать прогу деления двух чисел, причем что бы...

Деление
Всем привет! Нужна помошь по математике :wacko: Нужно делить дробные числа. Максимальное число...

Деление
data SEGMENT a DW 20 b DW 6 c DW ? data ENDS code SEGMENT assume cs:code,ds:data...

67
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
13.01.2013, 11:02 41
Цитата Сообщение от ptoop
Я то думал какой-нибудь мудрёный фильтр, или что-то подобное, где каждая микросекунда дорога...
Дык, а я о чем. Честно говоря, мне и не хватает фантазии придумать такую задачу, где нужно использовать указанный перевод в "мудреном фильтре". Разве что создание виртуальной машины с двоично-десятичной системой счисления. Так и то: на входе преобразовал и баста. Дальше уж речь идет о 2-10-й арифметике :)
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
13.01.2013, 12:06 42
Цитата Сообщение от drvtos
Цитата Сообщение от putmom
всё работает, но хочется же всегда чего то побыстрее.
Пользователю будет выводиться на индикатор время в процентах оставшегося заряда АКБ у велофары
Приделай электромоторчик, будет быстрее ехать :)
Извините, что задал глупый вопрос, просто хотелось быстрее, ну и пусть что времени много для вывода на индикатор.
Больше не буду =)
Моторчик уже есть, 1 Квт., на старте в пике 3 Квт, макс. скорость 63 по плоскачу в безветрие.


<Изображение удалено>
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
13.01.2013, 12:55 43
Цитата Сообщение от putmom
макс. скорость 63 по плоскачу в безветрие.
Не спеши, дорогой. Будь внимателен и осмотрителен. Без шуток.

Моя любимая теща вчера погуляла, посмотрела замороженные цветы (или цветы во льду, точнее). Поскользнулся-упал-закрытый перелом бедра. Готовимся к операции. Я стану на пару тысяч баксов легче :)
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.01.2013, 13:22 44
Цитата Сообщение от Bytt
Цитата Сообщение от tyzord66
Не придумал ничего лучше того, что под спойлером .... Может у кого то этот метод получится быстрей?
Это код можно сделать короче и, соответственно, быстрее.
Ну, дык поучаствуйте, может что то на заметку можно будет взять ;)
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
13.01.2013, 13:55 45
>>Извините, что задал глупый вопрос, просто хотелось быстрее, ну и пусть что времени много для вывода на индикатор.

А вопрос совсем не глупый и многих интересует. В результате таких вопросов и рождаются шедевры программирования
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
13.01.2013, 15:50 46
Цитата Сообщение от drvtos
Поскользнулся-упал-закрытый перелом бедра. Готовимся к операции. Я стану на пару тысяч баксов легче :)
Брат..... я не понял..... это ты про себя?..... Или все таки теще операция нужна?.....
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
13.01.2013, 15:58 47
Брат, я так проЦиЦировал классику совейского кино :)
Теще, ей, любимой. А в ее не юные годы... В общем, когда посидишь пару часов в приемном отделении, куда пачками везут народ с поломанными ногами, начинаешь переживать за велосипедистов. Так что, уважаемый ТС, извини за оффтоп, но я под впечателнием.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
13.01.2013, 16:28 48
Успокоил.....
Хотя..... и тещу тоже жалко....

Насчет вывода данных на индикатор:
Если данные быстро меняются, а дисплей обновлять с частотой 10 Гц или больше, то показания начинают сливаться, и не возможно высмотреть отдельое измерение.....
Я поэтому занижаю скорость обновления индикатора, примерно до 5 Гц.... наглядность процесса остается более менее, и показания не мажутся скачками цифер.....
Это соответственно 200мс на сеанс, а за 200 мс можно я не знаю чего вычислить..... помоему, можно не ломать голову, а применить наиболее наглядный и простой алгоритм.... я например раньше методом johnny0007 пользовался..... а как перешел на Си, стал использовать остаток от деления на 10, еще нагляднее процедура, хотя и попрожорливее наверное.....

зы Обновления - это я не имел ввиду динамическую индикацию.... имел ввиду периодичность вывода на дисплей новых данных.
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
13.01.2013, 16:51 49
а если, скажем, надо экономить батарейку, то деления циклами - зло. так что, опять надо плясать от задачи.
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
13.01.2013, 19:10 50
Батарейку экономить не надо, она экономится только во время "простоя" велосипеда, драйвер впадает в спячку.
Деление на 100,10,1 для вывода на индикатор у меня происходит довольно часто - 31 раз в секунду, но от общего времени процессора это малая толика. Так что пока нет жестких рамок по времени оставлю эту затею.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.01.2013, 23:03 51
Цитата Сообщение от putmom
Так что пока нет жестких рамок по времени оставлю эту затею.
Так Вам быстрый вариант уже не нужен? :)
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
14.01.2013, 08:23 52
Цитата Сообщение от tyzord66
Цитата Сообщение от putmom
Так что пока нет жестких рамок по времени оставлю эту затею.
Так Вам быстрый вариант уже не нужен? :)
Как же не нужен, нужен !!!
Просто начали отговаривать из-за нецелесообразности всвязи с нечастым выводом на индикатор.
0
ptoop
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
14.01.2013, 08:58 53
Не, сами алгоритмы никогда лишними не бывают! Выкладывайте :)
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
14.01.2013, 10:00 54
На самом деле ТС неправильно сформулировал вопрос - ему нужно не деление на 10, а преобразование в BCD

http://rodyodid.ru/forum/viewtopys.php?f=7&t=156
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
14.01.2013, 10:37 55
Цитата Сообщение от putmom
Как же не нужен, нужен !!!
Просто начали отговаривать из-за нецелесообразности всвязи с нечастым выводом на индикатор.
Интересующий Вас метод на асме в конце первой страницы под спойлером. Сразу после этого заявления:
Цитата Сообщение от putmom
Действительно оно того не стоит, вычитанием 10-ки проще и нагляднее получается.
Оставляю значит как есть процедуру в своей программе.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
14.01.2013, 10:43 56
Цитата Сообщение от Johmmy0007
На самом деле ТС неправильно сформулировал вопрос - ему нужно не деление на 10, а преобразование в BCD

http://rodyodid.ru/forum/viewtopys.php?f=7&t=156
Для BCD есть достаточно компактный и быстрый метод, описан в AVR204
0
putmom
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 35
14.01.2013, 11:17 57
Цитата Сообщение от Johmmy0007
На самом деле ТС неправильно сформулировал вопрос - ему нужно не деление на 10, а преобразование в BCD
Мне не только для индикатора, мне в программе еще нужно на 10 делить число от 1 до 100.
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
14.01.2013, 11:50 58
>>мне в программе еще нужно на 10 делить число от 1 до 100

ну уж тут вычитания, наверно, проще всего - максимум 10 простейших циклов
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
14.01.2013, 11:58 59
Цитата Сообщение от putmom
мне в программе еще нужно на 10 делить число от 1 до 100.
Но только до 178

DIV_D - что делить

на выходе
- DIV_Q - результат
- DIV_D - остаток

Если остаток не нужен - последние 3 команды не нужны.

Код
    ldi     DIV_Q, 0x67
mul     DIV_Q, DIV_D
mov     DIV_Q, r1
lsr     DIV_Q
lsr     DIV_Q

ldi     TEMP, 10
mul     DIV_Q, TEMP
sub     DIV_D, r0

ret
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
14.01.2013, 12:11 60
Кстати, и ещё.
Мы тут касаемся точных алгоритмов, а они часто не нужны на практике абсолютно, как в случае с велосипедом.
Например снимаем показания с АЦП - там уже есть погрешности, так стоит ли ломать голову, проще добавить ещё одну, но упростить алгоритм.

например, можно заменить деление умножением, поскольку аппаратный умножитель имеется.
надо поделить на 10? тупо умножаем на дробь, обратную данной, т.е. 1/10
1/10 это примерно 6554/65536
в знаменателе - число, на которое легко делить сдвигом (степень двойки)
так можно делить на любые числа, не забивая себе голово заумными алгоритмами, про погрешность я уже сказал, будет - но в разумных пределах и ничего страшного
0
14.01.2013, 12:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 12:11

Деление на 0
Все говорят на 0 делить нельзя,но я поделил,в чем тут подвох #include &lt;iostream&gt; using...

Деление на 5
Дано число в шестнадцатеричной системе счисления. Число может быть очень большое. Требуется...

деление
подскажите. допустим в переменной типа string находится число 8192. требуется разделить это число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru