Souvent dans mes boucles internes-je besoin pour indexer un tableau dans un "wrap-around", de façon que si la taille de la matrice est de 100 et mon code demande pour l'élément -2, il devrait être donné élément 98. Dans de nombreux langages tels que Python, on peut le faire simplement avec de l' my_array[index % array_size]
, mais pour une raison quelconque C de l'arithmétique des nombres entiers (généralement) de tours vers zéro au lieu de systématiquement arrondi vers le bas, et, par conséquent, son opérateur modulo retourne un résultat négatif lors d'une négative premier argument.
Souvent je sais qu' index
ne sera pas inférieur -array_size
, et dans ces cas je ne l' my_array[(index + array_size) % array_size]
. Cependant, parfois, ce ne peut être garanti, et pour les cas je voudrais savoir le moyen le plus rapide à mettre en œuvre un toujours positif modulo fonction. Il y a plusieurs "intelligents" les moyens de le faire sans ramification, tels que
inline int positive_modulo(int i, int n) {
return (n + (i % n)) % n
}
ou
inline int positive_modulo(int i, int n) {
return (i % n) + (n * (i < 0))
}
Bien sûr, je peux le profil de ces à savoir qui est le plus rapide sur mon système, mais je ne peux pas l'aider à se soucier que je pourrais avoir manqué un meilleur, ou que ce qui est rapide sur ma machine peut être lente sur une autre.
Donc, il y a un moyen standard pour ce faire, ou quelque astuce que j'ai raté qui est susceptible d'être le plus rapidement possible?
Aussi, je sais que c'est sans doute un vœu pieux, mais si il y a une façon de le faire qui peut être auto-vectorielle, ce serait formidable.