Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в целочисленной арифметике / заменить * 
:(
    Опции темы
ANTON_AL
Дата 16.11.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Доброго дня!


Я пишу JPEG кодек, который повязан на целочисленной арифметике.
На стадии квантования требуется разделить каждый член блока 8x8 на коэффициент квантования. Этот этап и породил сию тему.

Задача: есть целое число, например 140, его надо разделить на другое число, например 7 и получить соответственно 20.
Надо найти некое число R (эквивалент 1/7), умножив которое на 140 мы получим 20(т.е. результат "деления")
   140 * R = 20;             ( R - ? ).

Числа представлены в бинарном виде, и они целые. Разрядность - 16 бит.

Ещё раз в бинарном виде:
10001100 / 111 = 10100

А надо так:
10001100 * R = 10100;               R - ?


Это сообщение отредактировал(а) ANTON_AL - 16.11.2007, 18:35
PM MAIL   Вверх
maxim1000
Дата 16.11.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



тут в пределах 16 бит, наверное, не получится...


--------------------
qqq
PM WWW   Вверх
ANTON_AL
Дата 16.11.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Язык C++. Но дело не в нём, я использую SSE2, а там нет операции деления, есть только умножение.
PM MAIL   Вверх
maxim1000
Дата 16.11.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



если, конечно, числа могут занимать все 16 бит
если у нас 8-битные числа, и допустима 16-разрядная арифметика, то можно так:
x/y=x*(1/y)=x*(A/y)/A
вместо A можно взять степень двойки
заранее посчитать A/y
а при вычислении x*(y/A)/A деление на A заменять сдвигом


--------------------
qqq
PM WWW   Вверх
stab
Дата 17.11.2007, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Цитата(maxim1000 @  16.11.2007,  22:50 Найти цитируемый пост)
если у нас 8-битные числа, и допустима 16-разрядная арифметика, то можно так

Для 7 тогда максимум точности без переполнений даст 146 / 1024, но ошибка уже в четвёртом знаке будет. Ещё тонкий момент со знаками, так что осторожно надо сдвигать.



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
maxim1000
Дата 17.11.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



не уверен, что получится найти множитель, который давал бы точный результат деления...


--------------------
qqq
PM WWW   Вверх
stab
Дата 17.11.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



maxim1000, если арифметику на 32 бита перевести для байтовых операндов, то 9586981 / 67108864 (2^26) даёт уже неплохой результат с ошибкой только в девятом знаке.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.