Résumé:
Je suis à la recherche de la façon la plus rapide pour calculer
(int) x / (int) y
sans se faire une exception pour y==0
. Au lieu de cela, je veux juste que l'arbitraire d'un résultat.
Arrière-plan:
Lors du codage d'algorithmes de traitement d'image, j'ai souvent besoin de diviser par un (cumul) la valeur alpha. La variante la plus simple est de la plaine du code C avec l'arithmétique des nombres entiers. Mon problème est que j'ai généralement obtenir une division par zéro pour résultat pixels avec alpha==0
. Cependant, ce sont exactement les pixels où le résultat n'est pas grave du tout: je ne me préoccupe pas de la couleur des valeurs de pixels avec alpha==0
.
Détails:
Je suis à la recherche de quelque chose comme:
result = (y==0)? 0 : x/y;
ou
result = x / MAX( y, 1 );
x et y sont des entiers positifs. Le code est exécuté un grand nombre de fois dans une boucle imbriquée, donc je suis à la recherche d'un moyen de se débarrasser de la condition de branchement.
Lorsque y ne pas dépasser la plage d'octets, je suis heureux avec la solution
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
Mais de toute évidence, cela ne fonctionne pas bien pour les grandes plages.
Je suppose que la dernière question est: quel est le plus rapide peu tourner hack changement de 0 pour toute autre valeur entière, tout en laissant toutes les autres valeurs inchangées?
Précisions
Je ne suis pas sûr à 100% que la ramification est trop cher. Cependant, des compilateurs différents sont utilisés, donc je préfère la comparaison avec peu d'optimisations (ce qui est discutable).
Pour sûr, les compilateurs sont grands quand il s'agit à peu se tourner, mais je ne peux pas exprimer le "don't care" résultat dans C, de sorte que le compilateur ne sera jamais en mesure d'utiliser la gamme complète des optimisations.
Le Code doit être entièrement C compatible, le principal sont les plates-formes Linux 64 Bits avec gcc et clang et MacOS.