Нам часто приходится находить значения делителей в нашей структуре часов, которые генерируют тактовую частоту , ближайшую к целевой частоте, т.е. ABS(target_rate - input_rate / best_div)
должно быть минимальным.Мы ограничены целочисленной арифметикой и используем следующую формулу:
int best_div, input_rate, target_rate;
best_div = (input_rate + target_rate / 2) / target_rate;
Мы можем с уверенностью предположить, что input_rate >= target_rate
, input_rate > 0
и target_rate > 0
.
Однако есть некоторыечисла, для которых формула "терпит неудачу", например input_rate = 12152131, target_rate = 441992
.Для этих чисел формула вернет best_div = 27
, тогда как 28
приведет к ставке, близкой к 441992
.
Это приводит к двум вопросам:
- Почему формулане правильно в этом случае?
- Есть ли здесь отказоустойчивая формула для поиска лучшего делителя?Очевидно, что можно просто вычислить результирующую частоту для обоих делителей,
input_rate / target_rate
и input_rate / target_rate + 1
, и выбрать лучшую, но предпочтительной будет более простая, прямая формула.