Самый быстрый способ получить положительный по модулю в C / C ++
Часто в моих внутренних циклах мне нужно индексировать массив «циклически», так что если размер массива равен 100, а мой код запрашивает элемент -2, ему должен быть задан элемент 98. Во многих языках высокого уровня, таких как как Python, это можно сделать просто сmy_array[index % array_size]
, но по какой-то причине целочисленная арифметика C (обычно) округляется до нуля вместо последовательного округления вниз, и, следовательно, его оператор по модулю возвращает отрицательный результат, когда ему передается отрицательный первый аргумент.
Часто я знаю, чтоindex
не будет меньше чем-array_size
и в этих случаях я просто делаюmy_array[(index + array_size) % array_size]
, Однако иногда это не может быть гарантировано, и для этих случаев я хотел бы знать самый быстрый способ реализации всегда положительной функции по модулю. Есть несколько «умных» способов сделать это без ветвления, таких как
inline int positive_modulo(int i, int n) {
return (n + (i % n)) % n
}
или же
inline int positive_modulo(int i, int n) {
return (i % n) + (n * (i < 0))
}
Конечно, я могу профилировать их, чтобы узнать, какая из них самая быстрая в моей системе, но я не могу не беспокоиться о том, что, возможно, пропустил лучшую или что скорость на моей машине может быть медленной на другой.
Так есть ли стандартный способ сделать это, или какой-то умный трюк, который я пропустил, который, вероятно, будет самым быстрым из возможных?
Кроме того, я знаю, что это, вероятно, желаемое за действительное, но если есть способ сделать это, который может быть автоматически векторизован, это было бы удивительно.