Я ищу безопасный от переполнения метод для выполнения округленного деления целых чисел без знака.
У меня есть это:
uint roundDiv(uint n, uint d)
{
return (n + d / 2) / d;
}
Но, к сожалению, выражение n + d / 2
может переполняться .
Я думаю, мне придется проверить, меньше ли n % d
, чем d / 2
.
Но сам d / 2
может обрезаться (когда d
нечетное).
Итак, я решил, что должен проверить, меньше ли n % d * 2
, чем d
.
Или даже без логического условия, полагайтесь на тот факт, что n % d * 2 / d
либо 0
или 1
:
uint roundDiv(uint n, uint d)
{
return n / d + n % d * 2 / d;
}
Это работает хорошо, однако, опять же, n % d * 2
может переполняться.
Есть ли какой-либо собственный способ достижения округлого целочисленного деления, безопасного для переполнения ?
Обновить
Я придумал следующее:
uint roundDiv(uint n, uint d)
{
if (n % d < (d + d % 2) / 2)
return n / d;
return n / d + 1;
}
Тем не менее, выражение d + d % 2
может переполняться.