Задача алгоритма: создать непрерывные дроби для числа с плавающей запятой

( РЕДАКТИРОВАТЬ : В ответ на сварливые комментарии: Нет, это не домашнее задание. Я работаю над определением высоты тона, взяв массив потенциальных гармонических пиков и попытавшись построить кандидатов на основную частоту. Итак, это на самом деле очень практичный вопрос.)

Рассмотрим наилучшие дробные приближения для (например) числа пи, упорядоченные по возрастанию знаменателя: 3/1, 22/7, 355/113, ...

Задача: создать tidy C-алгоритм, который будет генерировать n-е частное приближение a / b для данного числа с плавающей запятой, возвращая также расхождение.

calcBestFrac (float frac, int n, int * a, int * b, float * err) {...}

Я считаю, что лучший метод - это непрерывные дроби

Уберите дробную часть числа пи, и вы получите 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 далеко не так просто. Я выложу, если получу что-нибудь аккуратное. А пока кому-то это может понравиться как головоломка.

14
задан P i 9 January 2011 в 08:56
поделиться