![]() |
|
|
![]()
|
|
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
тут в пределах 16 бит, наверное, не получится...
-------------------- qqq |
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Язык C++. Но дело не в нём, я использую SSE2, а там нет операции деления, есть только умножение.
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
Для 7 тогда максимум точности без переполнений даст 146 / 1024, но ошибка уже в четвёртом знаке будет. Ещё тонкий момент со знаками, так что осторожно надо сдвигать. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
не уверен, что получится найти множитель, который давал бы точный результат деления...
-------------------- qqq |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: нет Всего: 48 |
maxim1000, если арифметику на 32 бита перевести для байтовых операндов, то 9586981 / 67108864 (2^26) даёт уже неплохой результат с ошибкой только в девятом знаке.
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |