Resumen:
Estoy buscando la forma más rápida de calcular
(int) x / (int) y
sin obtener una excepción para y==0
. En cambio, solo quiero un resultado arbitrario.
Antecedentes:
Al codificar algoritmos de procesamiento de imágenes, a menudo necesito dividir por un valor alfa (acumulado). La variante más simple es el código C simple con aritmética de enteros. Mi problema es que normalmente obtengo una división por error cero para los píxeles de resultado con alpha==0
. Sin embargo, estos son exactamente los píxeles en los que el resultado no importa en absoluto: no me importan los valores de color de los píxeles con alpha==0
.
Detalles:
Estoy buscando algo como:
result = (y==0)? 0 : x/y;
o
result = x / MAX( y, 1 );
xey son números enteros positivos. El código se ejecuta una gran cantidad de veces en un bucle anidado, por lo que estoy buscando una forma de deshacerme de la ramificación condicional.
Cuando y no excede el rango de bytes, estoy satisfecho con la solución
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
Pero esto obviamente no funciona bien para rangos más grandes.
Supongo que la pregunta final es: ¿Cuál es el truco más rápido que cambia de 0 a cualquier otro valor entero, dejando todos los demás valores sin cambios?
Aclaraciones
No estoy 100% seguro de que la ramificación sea demasiado cara. Sin embargo, se utilizan diferentes compiladores, por lo que prefiero la evaluación comparativa con pequeñas optimizaciones (lo que de hecho es cuestionable).
Por supuesto, los compiladores son geniales cuando se trata de juegos de bits, pero no puedo expresar el resultado "no me importa" en C, por lo que el compilador nunca podrá usar la gama completa de optimizaciones.
El código debe ser totalmente compatible con C, las principales plataformas son Linux de 64 bits con gcc & clang y MacOS.
y += !y
¿ Quizás ? No se necesita ninguna rama para calcular eso. Se podría comparar x / (y + !y)
con x / max(y, 1)
y quizás también y ? (x/y) : 0
. Supongo que no habrá ninguna rama en ninguno de ellos, al menos con las optimizaciones activadas.
0
secciones alfa son enormes y contiguas. Hay un lugar para jugar con las micro optimizaciones, y las operaciones por píxel es exactamente ese lugar.