Math Looping Между Min и Max, используя мод? - PullRequest
8 голосов
/ 17 июня 2010

Я пытаюсь построить крошечную (или, возможно, не очень крошечную) формулу, которая будет содержать числа между установленным минимумом и максимумом, но также зациклить эти числа, чтобы они не обрезались, если они находятся за пределами диапазона.пока что это то, что у меня есть.

min1 = 10
max1 = 90

val1 = 92
//will make 11, which is what i want since it loops

formula:  min(max(min1,min(val1,max1)),mod(val1,max1)+min1)

однако, я бы хотел, чтобы оно также зацикливалось на другое направление, так что если val1 равен 5, то есть -5 вне min1, он станет86.

другая проблема, с которой я сталкиваюсь, состоит в том, что

max1 % max1 != max1

, как я хочу, так как макс является частью диапазона

, пытаясь очиститьВот несколько примеров желаемого вывода на основе диапазона с циклом

min1 = 10
max1 = 90
----------------------------------------------
val1 = 30    //within range: stays as 30 
val1 = 90    //within range: stays as 90
val1 = -6    //below range: loops to becomes 75
val1 = 98    //above range: loops to becomes 17
val1 = 91    //above range: loops to becomes 10

. Я бы не хотел использовать серию операторов if / else, но было бы хорошо, если бы это было абсолютно необходимо.это вообще возможно?

Ответы [ 3 ]

3 голосов
/ 17 июня 2010
int loop(int val, int min, int max)
{
    int p = max-min+1;
    int mod = (val-min)%p;
    if(mod<0)
        mod += p;
    return min+mod;
}
1 голос
/ 17 июня 2010

Математически вы должны быть в состоянии сделать что-то вроде этого:

((val-min) `mod` (max-min+1)) + min

Переместите свой диапазон вниз, чтобы он начинался с нуля, отрежьте верхний предел и сместите его обратно в правильный диапазон.К сожалению, оператор% в C дает отрицательные результаты для отрицательных чисел.Итак:

3 % 10 => 3
13 % 10 => 3
-3 % 10 => -3
-13 % 10 => -3

Итак, чтобы избавиться от этих негативов, нам понадобится один дополнительный модуль:

((val-min)%(max-min+1) + (max-min+1)) % (max-min+1) + min
1 голос
/ 17 июня 2010

Извините. Удален предыдущий ответ. Попробуйте это:

((Val-мин)% (макс-мин) + макс-мин)% (макс-мин) + мин

РЕДАКТИРОВАТЬ: если вы хотите, чтобы max было допустимым значением вместо переполнения до min, замените max на max + 1 во всех 3 местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...