Нахождение лучшего делителя с использованием целочисленной арифметики - PullRequest
0 голосов
/ 13 июня 2018

Нам часто приходится находить значения делителей в нашей структуре часов, которые генерируют тактовую частоту , ближайшую к целевой частоте, т.е. 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.

Это приводит к двум вопросам:

  1. Почему формулане правильно в этом случае?
  2. Есть ли здесь отказоустойчивая формула для поиска лучшего делителя?Очевидно, что можно просто вычислить результирующую частоту для обоих делителей, input_rate / target_rate и input_rate / target_rate + 1, и выбрать лучшую, но предпочтительной будет более простая, прямая формула.
...