Округление в большую сторону
Откуда взялась формула (a + b - 1) / b для округления дроби в большую сторону?
Где можно прочитать про ее вывод?
Ответы (2 шт):
Ну а что тут читать? естественно, предполагается, что a и b - натуральные, так?
Тогда при a в диапазоне от kb+1 до kb+b мы должны получить в качестве "окргуления" :) в большую сторону значение k+1. Так?
Например, от 11 до 15 при делении на 5 мы должны получить 3.
В нашем распоряжении есть целочисленное деление, отбрасывающее дробную часть. Чтобы получить с его помощью значение k+1 для a = kb+1, мы должны прибавить к нему по крайней мере b-1, и получить kb+b, которое при делении на b даст ровно k+1, без остатка.
Если мы это же значение прибавим к следующему по величине числу, получится тот же результат деления, так как остаток 1/b будет отброшен. И так - до значения kb+b, при котором деление отбросит остаток (b-1)/b, меньший 1.
Вот собственно и все. Получается, что прибавление b-1 обеспечивает округление a/b в большую сторону за счет появления остатка, меньшего 1, при целочисленном делении.
Разжевывание 1
Любое число a можно представить как kb+c, где k — результат целочисленного деления a на b, а c — остаток от деления.
Например, a = 12, b = 5, итого k = 2, c = 2. Вы хотите с округлением в большую сторону получать как результат не 2, а 3.
При делении kb на b получается ровно k, так что округление в большую сторону дает тот же результат. А вот для чисел от kb+1 до kb+b-1получающийся результат целочисленного деления k нужно для округления в большую сторону увеличить на 1. Т.е. по сути прибавить b/b...
Разжевывание 2
По сути нужно прибавить к результату 1, т.е. b/b, т.е. вроде бы a/b+b/b = (a+b)/b, но этот результат будет неверен для a = kb, так что знаменатель надо чуточку уменьшить - до (a+b-1)/b. Тогда для a = kb получим k (как и надо), а для всех больших kb, но меньших (k+1)b — k+1, как и требовалось.
Отступление
По сути, нужно получить функцию "потолок" из функции "пол" для дроби (см. об этих функциях здесь).
при обычном делении получаем округление в меньшую
6 / 7 = 0
7 / 7 = 1
8 / 7 = 1
а вы хотите в большую. Добавляем делитель
(6 + 7) / 7 = 1
(7 + 7) / 7 = 2
(8 + 7) / 7 = 2
Чуть чуть не так, хочется 7 / 7 = 1 , тогда отнимаем единицу
(6 + 7 - 1) / 7 = 1
(7 + 7 - 1) / 7 = 1
(8 + 7 - 1) / 7 = 2
Вот и получилась формула методом тыка (число + делитель - 1) / делитель