Существует «простая» простая математическая формула для выравнивания данных, содержащаяся в исходном коде сборки TinyPE, по этому адресу:
http://www.phreedom.org/solar/code/tinype/
Это формула:
%define round(n, r) (((n+(r-1))/r)*r)
Я знаю, что его основное намерение состоит в том, чтобы выровнять числа типа n = 31 с чем-то вроде округления (n, r) == 32 при r = 8.
Я знаю, что n представляетпредполагаемое число, а r - это кратное «базовое» число.Я также знаю, что, учитывая, что это простой исходный код сборки, все операции возвращают только целые числа, поэтому любые десятичные дроби удобно теряются и, следовательно, не вызывают каких-либо "ошибок" в вычислениях.
Вопрос в следующем:объяснение является точным, или, если есть, лучшее, более правильное.Я не хочу слепо использовать фрагмент, который я мог бы неправильно понять.
Кроме того, мне бы хотелось использовать число + (округление% (число% округление)), но это вызывает деление на ноль, когда "число"является точным кратным" раунд ".
Эта формула получает ближайшее кратное число, которое является степенью двух:
В этом примере наш номер 31 и числомы хотим, чтобы в качестве «базового» множителя было 8. Он возвращает 32:
(((31+(8-1))/8)*8)
Сначала мы получаем 8-1, что дает 7. Мы добавляем его к 31, что дает 38.
Затем мы делим 38/8, что дает 4,75.Исходя из этого, целочисленное значение равно 4.
Это 4 умножается на 8, что дает 32.
Логическое / математическое намерение каждой из этих частей формулы выглядит следующим образом:
- В 8-1 части присутствует наличие избытка, независимо от того, является ли исходное число (в данном случае 31) кратным или нет основного числа округления (в данном случае 8), и это дает диапазон, которыйпроходит через 7 не кратных чисел и возможное многократное.-1 приводит к тому, что мы не получаем неправильный расчет, переходя прямо к следующему не ближайшему мультипликатору, а просто дают неточный запас для определения остальных предыдущих «факторов».
- Делениемэто превышенное число на базовое кратное (в нашем случае 8), в его целочисленной части мы получаем только предыдущие факторы.Превышение, которое мы добавляем к нему, приводит к тому, что число выравнивается с ближайшим кратным числом, если оно находится в пределах ближайшего диапазона, не увеличиваясь до двух кратных вперед (отсюда -1).
- путем умножения чистоЦелая часть этого множителя (в нашем случае 4) по базовому кратному r (в нашем случае 8), мы получаем точное ближайшее кратное, не переходя к следующему.Например, ближайшее кратное 8, начиная с 31, равно 32, а не 40.