Я создал структуру "Range", которая содержит два целых числа, называемых min и max.Я пытаюсь написать функцию, которая принимает целое число и переполняет его, если оно выходит за пределы диапазона.Например, если у меня есть диапазон 1-100
и я передаю 105
, возвращаемое значение должно быть 5
.
. Код работает нормально, когда я пытаюсь переполнить значение, превышающее максимальноено когда значение ниже минимального, происходит непредвиденное поведение, и я не могу найти правильную формулу.
Это структура диапазона, которую я использую
struct Range
{
int min;
int max;
};
И это объявление функциикоторый я использую для кода ниже
int overflowRange(const Range &range, int n)
Вот код, когда значение выходит за пределы диапазона. max
if (n > range.max)
{
double dist = static_cast<double>(n - range.max);
double length = (range.max - range.min) + 1;
//How many ranges away is n ?
double numRanges = std::ceil(dist / length);
return static_cast<int>(n - (length * numRanges));
}
А вот код, когда значение выходит за пределы диапазона.мин
else if (n < range.min) //n is the tested integer
{
double dist = static_cast<double>(range.min - n);
double length = (range.max - range.min);
//How many ranges away is n ?
int numRanges = static_cast<int>(dist / length);
return static_cast<int>((range.min + length) - (dist - (length * numRanges)));
}
, когда dist / length == 1
или length * numRanges == dist
, возвращаемое значение иногда выходит за пределы диапазона.
Например: если диапазон равен 30-100
, а целое число равно -40
Я ожидаю, что возвращаемое значение будет 30
, но на самом деле оно 100
.