Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Atmega AVR микроконтроллер Fuse bit для тактирования 32768 кварцем http://www.cyberforum.ru/avr/thread2086670.html
Знатоки, подскажите, как выставить CKSEL на tiny 2313, чтоб задать тактирование от внешнего кварца 32768 Гц? В даташите: 0.4 - 0.9 Мгц 0.9 - 3.0 Мгц 3.0 - 8.0 Мгц 8.0 - 12 Мгц Про...
Помощь по макросам Atmega AVR микроконтроллер
Всем привет! Снова прошу вашей помощи, гиганты AVR :) Ребята, очень хочу научиться использовать макросы, но беда, не нахожу по ним уроки с нуля. Помогите, пожалуйста, понять вот эти строки: 1)...
Atmega AVR микроконтроллер Hapsim wanted
Форумчане, может есть у кого последняя версия Hapsyma, а то http://www.hitmix.at/hapsym/ кажется протух. Выложите куда-нибудь плз.
Atmega AVR микроконтроллер Режим захвата Подскажите, пожалуйста, доступен ли модуль захвата при работе Таймера1 (атмега328р)? Будет ли верхняя граница = OCR1x? Или таймер должен работать только в 4 или 12 режиме (СТС)? http://www.cyberforum.ru/avr/thread2086667.html
Atmega AVR микроконтроллер AtMega8, внешняя EEPROM и UART http://www.cyberforum.ru/avr/thread2086666.html
Всем привет. Нумбский вопрос, я новичок. Думаю над новой разработкой. Нужно послушать шину RS-485, и каждый байт записать в память. Если я для этого буду использовать ATMEGA8, успеет ли МК поймать...
Изменение приоритетов прерываний в Atmega328p Atmega AVR микроконтроллер
Столкнулся с проблемой которая требует чтобы текущий обработчик прерывания отработал без прерывания своей работы более высокоприоритетным прерыванием. Т.е. если в процессе обработки прерывания INT1,...
Atmega AVR микроконтроллер AVRstudio4 ASM. Адресация и инициализация EEPROM.
Есть кусок кода: ===== адреса переменных в EEPROM ===== .ESEG .org 0 EE_code_Unlock: .byte 2 EE_code_Service: .byte 2 EE_code_Test: .byte 2 EE_code_Educat: .byte 2 EE_Status: .byte 1...
Atmega AVR микроконтроллер Вопрос про общение с МК День добрый. Вот понадобилось реализовать установки параметров с помощью ПК, на ум лезет только передача команд такого типа "SIT DSTIME 20:50:10 17.01.2013 END" по USORT. Вопрос: Как обработать... http://www.cyberforum.ru/avr/thread2086663.html
Atmega AVR микроконтроллер Считать значение напряжения с нулевого канала АЦП http://www.cyberforum.ru/avr/thread2086662.html
Необходимо считать значение напряжения с нулевого канала АЦП. Какой АЦП выбрать? Может кто поможет в CodeVision сделать. Заранее спасибо за помощь!
Atmega AVR микроконтроллер Подмена стека Возникла такая задачка: при определенном прерывани необходимо СРОЧНО выполнить одну ПЕРВОСТЕПЕННУЮ и довольно громоздкую процедуру, и при ее выполнении оставить возмоность отрабатывать другим... http://www.cyberforum.ru/avr/thread2086661.html
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
09.01.2013, 11:11 0

Деление на 10.

09.01.2013, 11:11. Просмотров 25433. Ответов 67
Метки (Все метки)

Ответ

[QUOTE="putmom"]Нашел тут статейку по методам деления на 10 (http://we.iosyitistromyss.ru/Soft/pr...ye-chisla.html).
Заинтересовал метод сдвигами и сложениями.
Цитирую:
[QUOTE="Цитата:[/QUOTE]
Код:
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.
Код
    res.quot = n >> 1;      //0.5x
res.quot += res.quot >> 1;    //0.75x
res.quot += res.quot >> 4;    //0.796875x
res.quot += res.quot >> 8;    //0.7999877929685x
res.quot += res.quot >> 16;   //0.79999999813735485076904296875x
Или нет?

Вернуться к обсуждению:
Деление на 10.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2013, 11:11

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

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

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

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