![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Continued Fraction EvaluationBoost , Math Toolkit 2.5.0 , Internal tools
|
Выражение |
Описание |
---|---|
Gen::result_type |
Тип, который является результатом ссылки оператора(). Это может быть арифметический тип или std::pair<> арифметических типов. |
g() |
Возвращает объект типа Gen::result_type. Каждый раз, когда этот оператор называется, возвращается следующая пара a и b значений. Или, если тип результата_ является арифметическим типом, то следующее значение b возвращается и все значения a предполагается 1. |
Во всех выполняемых функциях оценки фракций параметр толерантность является требуемой в результате точностью, оценка фракции будет продолжаться до тех пор, пока последний срок оценки не оставит относительную ошибку в результате менее толерантность. Удаленные интерфейсы принимают ряд цифр точности здесь, внутренне они просто конвертируют это в терпимость и передний вызов.
Если задан параметр max_terms, то будет сделан не более max_terms, а на выходе будет установлен max_terms. Этот объект особенно полезен при профилировании постоянной доли для конвергенции.
Внутренне эти алгоритмы все используют модифицированный алгоритм Ленца: обратитесь к нумерным рецептам в C++, W. H. Press et all, глава 5 (особенно 5.2 Оценка непрерывных фракций, p 175 - 179) для получения дополнительной информации, также Lentz, W.J. 1976, Applied Optics, vol. 15, pp. 668-671.
Соотношение золотого фи = 1.618033989... может быть вычислено из простейшей продолжительной части всего:
Мы начинаем с определения функции генератора:
template <class T> struct golden_ratio_fraction { typedef T result_type; result_type operator() { return 1; } };
Золотое соотношение затем может быть вычислено для двойной точности, используя:
continued_fraction_a( golden_ratio_fraction<double>(), std::numeric_limits<double>::epsilon());
Тем не менее, более привычным является определение как a, так и b при оценке специальных функций с помощью постоянных фракций, например, функция загара определяется:
Поэтому его генераторный объект будет выглядеть так:
template <class T> struct tan_fraction { private: T a, b; public: tan_fraction(T v) : a(-v*v), b(-1) {} typedef std::pair<T,T> result_type; std::pair<T,T> operator()() { b += 2; return std::make_pair(a, b); } };
Обратите внимание, что если континуант вычитается из условий b, как это происходит здесь, то все условия a, возвращенные генератором, будут отрицательными. Функция тангента теперь может быть оценена с помощью:
template <class T> T tan(T a) { tan_fraction<T> fract(a); return a / continued_fraction_b(fract, std::numeric_limits<T>::epsilon()); }
Обратите внимание, что на этот раз мы используем версию «_b» для оценки доли: мы удаляем ведущий a термин во время оценки фракции, поскольку он отличается от всех остальных.
Статья Continued Fraction Evaluation раздела Math Toolkit 2.5.0 Internal tools может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Internal tools ::
реклама |