Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Все знают о замене целочисленного деления умножением с использованием обратного reciprocal. Пробую найти в сети упоминание о замене деления умножения с помощью обратного modular multiplicative inverse. И не находится. Киньте ссылочку, люди добрые :-) Вот пример, ищу нечто похожее (для C-шников - все числа и сдвиги беззнаковые): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Краткое описание здесь: http://guildalfa.ru/alsha/node/34 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 11:13 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Можно поискать похожий материал у: 1) Генри Уоррен - Алгоритмические трюки для программистов. 2) Степанов - От математики... В обоих книгах есть масса технических хитростей в численных методах. Но будьте осторожны. Часть этих методов дают приближенный результат. Например Уоррен приводит алгоритм деления без "деления" который дает шум в младших разрядах частного. Тоесть для бухгалтерского деления это может быть неприменимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 15:16 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Спасибо, сейчас гляну Степанова. У Уоррена точно не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 15:23 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
У Степанова тоже нет. Но интересно излагает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 16:22 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Для тех кто хочет поучаствовать в разборе алгоритма. Давайте переведем алгоритм из Паскале-Адо-подобного (о боже какая метафора) ЯП на язык математики. Я не могу прочитать словами алгоритм в том виде как он записан. Ибо я не помню как работает shr (что за хрень? Вроде сдвиг вправо? Вроде беззнаковый) и каков приоритет. Каков приоритет операций здесь? Код: sql 1. Сначала сдвиг? Или сначала произведение. И развернем операции в 1 на строку. Так будет их проще обсуждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 16:51 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
maytonДля тех кто хочет поучаствовать в разборе алгоритма. Давайте переведем алгоритм из Паскале-Адо-подобного (о боже какая метафора) ЯП на язык математики. Я не могу прочитать словами алгоритм в том виде как он записан. Ибо я не помню как работает shr (что за хрень? Вроде сдвиг вправо? Вроде беззнаковый) и каков приоритет. Каков приоритет операций здесь? Код: sql 1. Сначала сдвиг? Или сначала произведение. И развернем операции в 1 на строку. Так будет их проще обсуждать. shr - сдвиг вправо беззнаковый, shl - влево, приоритет сдвигов такой же как у умножения, значит, здесь операции выполняются слева направо, как написаны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 17:16 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Правильно ли я понимаю что эта функция делит делимое (dividend) на 10 и возвращает остаток в Rest? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 17:30 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
maytonПравильно ли я понимаю что эта функция делит делимое (dividend) на 10 и возвращает остаток в Rest? Да, правильно. Забыл добавить, у бинарного and приоритет такой же как у сдвигов и умножения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 17:32 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Эта функция делит делимое (dividend) на 10 и возвращает частное в Result, а остаток в Rest ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 17:36 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
А как "извне" получить доступ к Result? Он не объявлен в декларативной части функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 17:40 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
maytonА как "извне" получить доступ к Result? Он не объявлен в декларативной части функции. Это магия компилятора, результат функции возвращается в регистре eax. Возвращаемый результат можно использовать в операторах присваивания и вычислениях, например: Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 17:53 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, я знаю про эту магию. Я спрашиваю как нам протестировать эту замечательную функцию. Я считаю что TDD очень подходит для этой задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 17:59 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
maytonAleksandr Sharahov, я знаю про эту магию. Я спрашиваю как нам протестировать эту замечательную функцию. Я считаю что TDD очень подходит для этой задачи. Можно описать Result аналогично остатку, т.е. как еще один параметр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 18:07 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
или как локальную переменную и вернуть ее значение по return ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 18:18 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovили как локальную переменную и вернуть ее значение по return Исходя из главного кейса использования (функция должна расчитывать остаток от деления на 10) я-бы предложил оформить ее интерфейс так: Код: pascal 1. 2. 3. 4. 5. 6. 7. Тогда будут справедливы следующие кейсы Код: pascal 1. 2. 3. 4. И тест зациклить для большой выборки случайных чисел. P.S. Я не знаю как этих Паскалях-Оберонах пишут тесты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 18:30 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Все три функции (ShaDivMod10, ShaDiv10, ShaMod10) прошли полную проверку для всех возможных значений делимого 0..FFFFFFFF: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 18:39 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Круто. Значит метод точен. Мне это почему-то напомнило криптографию где есть операции с экзотическим модулем например (mod 255). А есть бенчмарк который сравнивает скорость ShaDivMod10 и обычного mod ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 18:48 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Разумеется, обычные div и mod медленнее. Сильно зависит от процессора. Но дело не в этом, а в том что 'ширина' произведения уменьшена, правда, ценой таблицы. Это новый алгоритм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 18:53 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovРазумеется, обычные div и mod медленнее. Сильно зависит от процессора. Но дело не в этом, а в том что 'ширина' произведения уменьшена, правда, ценой таблицы. Это новый алгоритм. А варианте с mod(...) Delphi генерит код с Код: xml 1. 2. 3. 4. ? Или как то по другому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 18:59 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Delphi оптимизирует только деление на 2^k, в остальных случаях использует честный div. Многие C-компиляторы могут оптимизировать деление заменой на 'широкое' умножение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 19:04 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Я думаю что Генри Уоррен все таки описывал ваш метод. Почитайте начиная с: Глава 10 - Целое деление на константы А также 10.9 Беззнаковое деление на делитель, не меньший 1. 10.14 (упоминание магических констант 66666667 и сдвигов для делителя 10). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 19:22 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
maytonЯ думаю что Генри Уоррен все таки описывал ваш метод. Почитайте начиная с: Глава 10 - Целое деление на константы А также 10.9 Беззнаковое деление на делитель, не меньший 1. 10.14 (упоминание магических констант 66666667 и сдвигов для делителя 10). Нет, у него везде используется "традиционный" метод. Лишь в 10.15 рассказывается, что для деления нацело можно использовать мультипликативный обратный и как его найти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2017, 20:06 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovmaytonЯ думаю что Генри Уоррен все таки описывал ваш метод. Почитайте начиная с: Глава 10 - Целое деление на константы А также 10.9 Беззнаковое деление на делитель, не меньший 1. 10.14 (упоминание магических констант 66666667 и сдвигов для делителя 10). Нет, у него везде используется "традиционный" метод. Лишь в 10.15 рассказывается, что для деления нацело можно использовать мультипликативный обратный и как его найти. На сайте книги Генри Уоррен дополнил главу 10 новым материалом http://www.hackersdelight.org/divcMore.pdf В добавлении в пункте 10-20 Converting to Exact Division он снова упоминает multiplicative inverse: авторSince the remainder can be computed without computing the quotient, the possibility arises of computing the quotient by first computing the remainder, subtracting this from the dividend n, and then dividing the difference by the divisor d. This last division is an exact division, and it can be done by multiplying by the multiplicative inverse of d (see Section 10–15 on page 190). This method would be particularly attractive if both the quotient and remainder are wanted. И снова предлагает использовать его только для деления нацело (т.е. если остаток заранее известен или вычислен каким-то иным способом) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2017, 13:32 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Возникла мысль. 1) Любое 32х разрядное целое можно факторизовать с небольшим количеством множителей. 2) Далее. Целочисленное деление сводится к сложениям и вычитаниям факторизованных делимого и делителя. 3) В конце - обратный перевод из факторизованной формы в 32х разрядное целое. Это только уножения и сложения. Таким образом мы избавились от деления по крайней мере в пунктах (2) и (3) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2017, 14:12 |
|
||
|
Замена деления умножением по-другому
|
|||
|---|---|---|---|
|
#18+
Еще есть метод о котором кажется писали Шикин и Боресков в Комп-графике. Я не помню точно все шаги но попробую воспроизвести похожие оптимизации по памяти. Они описывали для 16/32bit но я попробую обобщить на 32/64. Понимаю что это не формат топика но КМК это тоже можно рассмотреть. Я не умею пользоватся Latex, поэтому прошу прощения за возможные очепятки. Дано. Надо поделить A на B. При этом предполагается что A это переменная а B константа в рамках решаемой функции. Деление целочисленное. Без использования деления как такового в функции. Я предполагаю что A больше B иначе результат целочисленного деления лишен смысла. Я делаю следующие допущения. Далее несколько тождеств. Поскольку b=const, вводим магическое число Bm (множитель). Мы его расчитываем один раз для машей функции. Далее. Помня что деление-умножение на степени двойки - машинная операция сдвига получаем следующую формулу. Она лишена деления явно. Далее. Разрядная сетка. Мы не можем двигать а вправо без потери знаков. Поэтому мы вводим fixpoint-арифметику формата 32:32. Тоесть числа А и B хранятся в 64х битных регистрах. Но предварительно сдвигаются на 32 разряда влево. Shl(32,..) Младшие-же разряды используются как дробные. Внешние арифметика остается целочисленной. Дробность просто нами подразумевается. Магическое число в числителе 2^32 также предварительно сдвигается влево до упора. Открытые вопросы: 1) Точность. Какая она? Надо исследовать. 2) Эмуляция 64х на 32х. Некоторое железо должно эмулировать умножение с переносом. Надо исследовать. Со сдвигами все просто. Есть возможность двигать 32х разрядные с учотом переносов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2017, 15:02 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39507870&tid=1340303]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
272ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 382ms |

| 0 / 0 |
