( РЕДАКТИРОВАТЬ: В ответ на грубые комментарии, Нет, это не домашнее задание. Я работаю над обнаружением высоты тона, беря множество потенциальных гармонических пиков и пытаясь построить кандидатов на основную частоту. Таким образом, на самом деле это очень практичный вопрос.)
Рассмотрим наилучшие дробные аппроксимации для (например, pi), упорядоченные по возрастанию знаменателя: 3/1, 22/7, 355/113,...
Задача: создать аккуратный алгоритм C, который будет генерировать n-мерное приближение a/b для данного поплавка, возвращая также несоответствие.
calcBestFrac (float frac, int n, int * a, int * b, float * err) {...}
Лучшая техника, на которую я верю, продолженные дроби
Уберите дробную часть pi, и вы получите 3
Теперь остаток равен 0.14159... = 1/7.06251..
Итак, следующим лучшим рациональным является 3 + 1/7 = 22/7
Уберите 7 от 7.06251, и вы получите 0.06251.. Примерно 1/15.99659..
Назовите это 16, затем следующее наилучшее приближение - 3 + 1/(7 + 1/16) = 355/113
Однако, это далеко не тривиально, чтобы преобразовать в чистый C-код. Я отправлю, если я получу что-то аккуратное. Между тем, кто-то может наслаждаться этим как головоломка.