Самый быстрый способ получить положительный по модулю в 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))
}

Конечно, я могу профилировать их, чтобы узнать, какая из них самая быстрая в моей системе, но я не могу не беспокоиться о том, что, возможно, пропустил лучшую или что скорость на моей машине может быть медленной на другой.

Так есть ли стандартный способ сделать это, или какой-то умный трюк, который я пропустил, который, вероятно, будет самым быстрым из возможных?

Кроме того, я знаю, что это, вероятно, желаемое за действительное, но если есть способ сделать это, который может быть автоматически векторизован, это было бы удивительно.

Ответы на вопрос(6)

Ваш ответ на вопрос