Резюме:
Я ищу самый быстрый способ расчета
(int) x / (int) y
без исключения y==0
. Вместо этого я просто хочу произвольный результат.
Задний план:
При кодировании алгоритмов обработки изображений мне часто приходится делить на (накопленное) альфа-значение. Самый простой вариант - это простой код на C с целочисленной арифметикой. Моя проблема в том, что я обычно получаю ошибку деления на ноль для пикселей результата с alpha==0
. Однако это именно те пиксели, где результат вообще не имеет значения: меня не волнуют значения цвета пикселей с alpha==0
.
Подробности:
Я ищу что-то вроде:
result = (y==0)? 0 : x/y;
или
result = x / MAX( y, 1 );
x и y - положительные целые числа. Код выполняется огромное количество раз во вложенном цикле, поэтому я ищу способ избавиться от условного ветвления.
Когда y не превышает диапазон байтов, я доволен решением
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
Но это явно не работает для больших диапазонов.
Я предполагаю, что последний вопрос: какой самый быстрый способ взлома битов меняет 0 на любое другое целочисленное значение, оставляя все остальные значения без изменений?
Разъяснения
Я не уверен на 100%, что разветвление обходится слишком дорого. Однако используются разные компиляторы, поэтому я предпочитаю тестирование с небольшими оптимизациями (что действительно сомнительно).
Конечно, компиляторы хороши, когда дело касается битового тидлинга, но я не могу выразить результат «безразлично» на C, поэтому компилятор никогда не сможет использовать весь спектр оптимизаций.
Код должен быть полностью совместим с C, основными платформами являются Linux 64 Bit с gcc & clang и MacOS.
y += !y
? Для этого не нужна ветвь. Вы могли бы сравнить x / (y + !y)
против x / max(y, 1)
и , возможно , также y ? (x/y) : 0
. Думаю, ни в одном из них не будет ветки, по крайней мере, с включенной оптимизацией.
0
секции огромны и непрерывны. Есть место повозиться с микрооптимизациями, и попиксельные операции - это именно то место.