Как стать автором
Обновить

Комментарии 17

Правильно ли я понимаю, что «магические числа» вроде 0x92492492 — это на самом деле hex представление этих самых fixed point чисел?
Именно. В моей статье, достаточно просто взять binary rep. описанный и перевести в hex. Самое главное — магии нету никакой!

Кстати, в Intel Ice Lake уменьшили латенси у idiv более чем в 5 раз до 18 циклов (не помню на счет пропускной способности) — а это уже не так страшно как ранее.

Это случайно не перевод? Уж слишком статья пестрит бессмысленными применениями английских терминов или даже фраз:
можем получить Latency в 25-119 clock cycles, а reciprocal throughput — 25-120.

Fraction часть числа B.

умножению на truncating with rounding up 0.1

Выглядит weird и unnaturaly.
Особенно это:
получение старших битов 64 битного произведения в C++ коде реализуется интринсиком (something like mulh)

Тоже открывал эту Америку, что умножение — 1 такт, деление — 14, и велосипед изобретал.
А вот авторы gcc это знали давно, поэтому наколхоживание псевдоумножений в коде ничего не дало, только испортило читаемость.

Если не просят оптимизировать и ускорять, лучше не усложнять. Или сразу считать в q63.
Спасибо, давно искал эту тему на русском!

Но, теперь, когда вы понимаете как это работает, можете сами с легкостью заменить деление — умножением, не полагаясь на милость компилятору

… и такие исходники, которые junior и middle разработчики не поймут и не смогут поддерживать.

Вот так, на ровном месте, можно себе и компании создать проблемы.
Ну, сложно сказать — если контора математическая, код документируется, то вроде должно быть ОК. Собственно, в Алгоритме Ruy(printf) — сделано умножением, правда, со сдвигами. То есть, сий инженер из g00gl3 по факту написал тоже самое, что делают компиляторы видя / 10, оставив все теже сдвиги :]
Тема давно изложена на русском языке. Уоррен Г. «Алгоритмические трюки для программистов» bookfi.net/dl/437262/99b72b

Ну а прием этот эффективно работает далеко не всегда.
И да, «магические числа» — это из Уоррена. Так что Автор читал, но умолчал об источнике.
Не читал, если что. А смысл статьи больше лежит в последних абзацах. Но за источник — спасибо, я себя открывателем не называл!
Простите, но я не понял о чём статья:
…если делитель известен на этапе компиляции, есть возможность заменить целочисленное деление умножением и логическим сдвигом вправо (а иногда, можно обойтись и без него вовсе — я конечно про реализацию в Языке Программирования)
Если у меня в коде есть выражение X/10, что мне мешает просто заменить его на X*0.1?

То, что операция превращается из целочисленной во floating-point, вероятно.

Почему, если результат умножения 128-битный?
UPD. А, это если заменить целочисленные расчёты на FP…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации