Резюме:
Я ищу самый быстрый способ вычисления
(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 бит с gcc и clang и MacOS.