Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
30.01.2012, 11:03
|
|
Гражданин KAZUS.RU
Регистрация: 01.02.2011
Адрес: г. Долгопрудный
Сообщений: 996
Сказал спасибо: 339
Сказали Спасибо 95 раз(а) в 91 сообщении(ях)
|
Re: деление съедает ROM
yellow87, сначала домножить на 10 (100, 1000) и потом двигать, полученный результат поделить на 10 (100, 1000).
|
|
|
|
30.01.2012, 11:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: деление съедает ROM
Сообщение от yellow87
|
Easyrider83, если любое число меньшее 65536 сдвинуть на 16 разрядов вправо то получится нуль
|
Не всегда. Зависит от типа сдвигаемого числа.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
30.01.2012, 11:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: деление съедает ROM
При делении на константу, собственно операция деления и не нужна. Можно её заменить на умножение на число, обратное делителю.
Цитата:
|
Деление на константу можно сделать на обратное число. Чтобы произвести беззнаковое целочисленное деление q = x / d, вам вначале нужно посчитать число, обратное делителю, f = 2^r / d, где r определяет позицию двоично-десятичной точки (точка основания системы счисления). Затем нужно умножить x на f и сдвинуть полученный результат на r позиций вправо. Максимальное значение r равно 32+b, где b равно числу двоичных цифр в d минус 1. (b - это самое большое целое число, для которого 2^b ‹= d). Используйте r = 32+b, чтобы покрыть максильное количество возможных значений делимого x.
Этот метод требует некоторых приемов, чтобы скомпенсировать ошибки округления. Следующий алгоритм даст вам верные результаты для деления беззнакового целого чила с усечением, то есть тот же результат, что дает инструкция DIV (спасибо Terje Mathisen, который изобрел этот метод):
b = (количество значимых битов в d) - 1
r = 32 + b
f = 2^r / d
Если f - целое число, тогда d - это степень от 2: переходим к случаю A.
Если f - не целое число, тогда проверяем, меньше ли дробная часть f 0.5.
Если дробная часть f ‹ 0.5: переходим к случаю B.
Если дробная часть f › 0.5: переходим к случаю C.
случай A: (d = 2^b)
результат = x SHR b
случай B: (дробная часть f ‹ 0.5)
округляем f вниз до ближайшего целого числа
результат = ((x+1) * f) SHR r
случай C: (дробная часть f › 0.5)
округляем f вверх до ближайшего целого числа
результат = (x * f) SHR r
|
Целочисленное деление на константу (все процессоры)
Последний раз редактировалось AJScorp; 30.01.2012 в 11:15.
Причина: Указал источник
|
|
|
|
30.01.2012, 11:27
|
|
Гражданин KAZUS.RU
Регистрация: 01.02.2011
Адрес: г. Долгопрудный
Сообщений: 996
Сказал спасибо: 339
Сказали Спасибо 95 раз(а) в 91 сообщении(ях)
|
Re: деление съедает ROM
а какая вообще задача ? может и делить там ничего не надо.
|
|
|
|
30.01.2012, 11:54
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Деление съедает ROM
Сообщение от yellow87
|
Easyrider83, если любое число меньшее 65536 сдвинуть на 16 разрядов вправо то получится нуль
|
Да не может быть!
|
|
|
|
30.01.2012, 12:05
|
|
Вид на жительство
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: Деление съедает ROM
я использую результат типа unsigned long int
а он в моём компиляторе только почему-то двухбайтный
(int - однобайтный)
поэтому при умножении его на 10, 100 и т.д. возникнет переполнение
то же самое и со сдвигом вправо
Последний раз редактировалось yellow87; 30.01.2012 в 12:08.
|
|
|
|
30.01.2012, 12:05
|
|
Прописка
Регистрация: 07.03.2009
Адрес: MN
Сообщений: 168
Сказал спасибо: 6
Сказали Спасибо 31 раз(а) в 21 сообщении(ях)
|
Re: деление съедает ROM
Сообщение от Easyrider83
|
Деление на 65536 равносильно сдвигу вправо на 16 разрядов.
|
Там почему-то деление на 6553 5.
__________________
- Квадрат - это тоже прямоугольник, только более квадратный и не такой вытянутый
- Двуугольник - это треугольник, только поломанный
- Одноугольника не видел
|
|
|
|
30.01.2012, 13:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Деление съедает ROM
Сообщение от yellow87
|
я использую результат типа unsigned long int
|
Просто unsigned long
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
30.01.2012, 19:08
|
|
Вид на жительство
Регистрация: 16.09.2011
Сообщений: 343
Сказал спасибо: 10
Сказали Спасибо 171 раз(а) в 104 сообщении(ях)
|
Re: Деление съедает ROM
Сообщение от Easyrider83
|
Да не может быть!
|
Отчего ж не может? Может, если нет разрядов под дробную часть.
|
|
|
|
30.01.2012, 19:10
|
|
Вид на жительство
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: Деление съедает ROM
unsigned long int
unsigned long
unsigned int
дают одинаковый двухбайтовый результат
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:49.
|
|