Самый быстрый способ получить положительный по модулю в C/C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Самый быстрый способ получить положительный по модулю в C/C++

Сообщение Anonymous »

Часто во внутренних циклах мне нужно индексировать массив методом «зацикливания», чтобы (например), если размер массива равен 100, а мой код запрашивает элемент -2, ему должен быть присвоен элемент 98. . Во многих языках высокого уровня, таких как Python, это можно сделать просто с помощью my_array[index % array_size], но по какой-то причине целочисленная арифметика C (обычно) округляется до нуля вместо последовательного округления в меньшую сторону и, следовательно, по модулю. оператор возвращает отрицательный результат, если ему присвоен отрицательный первый аргумент.

Часто я знаю, что индекс не будет меньше, чем -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));
}
Конечно, я могу профилировать их, чтобы узнать, какой из них самый быстрый в моей системе, но я не могу не беспокоиться, что я мог пропустить лучший вариант или что то, что быстро на моей машине, может быть медленным на другой.

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

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

Подробнее здесь: https://stackoverflow.com/questions/149 ... ulo-in-c-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»