#include <boost/math/tools/rational.hpp>
template <std::size_t N, class T, class V>
V evaluate_polynomial(const T(&poly)[N], const V& val);
template <std::size_t N, class T, class V>
V evaluate_polynomial(const boost::array<T,N>& poly, const V& val);
template <class T, class U>
U evaluate_polynomial(const T* poly, U z, std::size_t count);
template <std::size_t N, class T, class V>
V evaluate_even_polynomial(const T(&poly)[N], const V& z);
template <std::size_t N, class T, class V>
V evaluate_even_polynomial(const boost::array<T,N>& poly, const V& z);
template <class T, class U>
U evaluate_even_polynomial(const T* poly, U z, std::size_t count);
template <std::size_t N, class T, class V>
V evaluate_odd_polynomial(const T(&a)[N], const V& z);
template <std::size_t N, class T, class V>
V evaluate_odd_polynomial(const boost::array<T,N>& a, const V& z);
template <class T, class U>
U evaluate_odd_polynomial(const T* poly, U z, std::size_t count);
template <std::size_t N, class T, class V>
V evaluate_rational(const T(&a)[N], const T(&b)[N], const V& z);
template <std::size_t N, class T, class V>
V evaluate_rational(const boost::array<T,N>& a, const boost::array<T,N>& b, const V& z);
template <class T, class U, class V>
V evaluate_rational(const T* num, const U* denom, V z, unsigned count);
Каждая из функций имеет три варианта: пара перегруженных функций, где порядок полиномиальной или рациональной функции оценивается во время компиляции, и перегрузка, которая принимает переменную времени выполнения для размера массива коэффициентов. Вообще говоря, оценка времени компиляции массива приводит к лучшей безопасности типа, менее подвержена ошибкам программиста и может привести к лучшему оптимизированному коду. Функции полиномиальной оценки, в частности, специализируются на различных размерах массивов, что позволяет разворачивать петли и, как можно надеяться, оптимальное встроенное расширение.
template <std::size_t N, class T, class V>
V evaluate_polynomial(const T(&poly)[N], const V& val);
template <std::size_t N, class T, class V>
V evaluate_polynomial(const boost::array<T,N>& poly, const V& val);
template <class T, class U>
U evaluate_polynomial(const T* poly, U z, std::size_t count);
Оценивает полином, описанный коэффициентами, хранящимися вполи.
Если размер массива указан во время выполнения, то у полинома большинство имеют порядокграфа-1сграфакоэффициентов. В противном случае есть порядокN-1сNкоэффициентами.
Коэффициенты должны храниться таким образом, чтобы коэффициенты для xiбыли в поли [i].
Типы коэффициентов и переменнойzмогут различаться до тех пор, пока*поликонвертируется в типU. Это позволяет, например, для таблицы коэффициентов быть таблицей целых чисел, если это уместно.
template <std::size_t N, class T, class V>
V evaluate_even_polynomial(const T(&poly)[N], const V& z);
template <std::size_t N, class T, class V>
V evaluate_even_polynomial(const boost::array<T,N>& poly, const V& z);
template <class T, class U>
U evaluate_even_polynomial(const T* poly, U z, std::size_t count);
Как и выше, но оценивает четный многочлен: тот, где все силыzявляются четными числами. Это эквивалентно призыву<evaluate_polynomial(poly,z*z,count)
>.
template <std::size_t N, class T, class V>
V evaluate_odd_polynomial(const T(&a)[N], const V& z);
template <std::size_t N, class T, class V>
V evaluate_odd_polynomial(const boost::array<T,N>& a, const V& z);
template <class T, class U>
U evaluate_odd_polynomial(const T* poly, U z, std::size_t count);
Как и выше, но оценивает полином, где все полномочия являются нечетными числами. эквивалентно<evaluate_polynomial(poly+1,z*z,
count-1)*
z+poly[0]
>.
template <std::size_t N, class T, class U, class V>
V evaluate_rational(const T(&num)[N], const U(&denom)[N], const V& z);
template <std::size_t N, class T, class U, class V>
V evaluate_rational(const boost::array<T,N>& num, const boost::array<U,N>& denom, const V& z);
template <class T, class U, class V>
V evaluate_rational(const T* num, const U* denom, V z, unsigned count);
Оценивает рациональную функцию (отношение двух полиномов), описанную коэффициентами, хранящимися вчислоидемом.
Если размер массива задан во время выполнения, то оба полинома больше всего имеют порядокграфа-1с коэффициентами. В противном случае оба полинома имеют порядокN-1с коэффициентамиN.
числоописывает числитель, адемонзнаменатель.
Коэффициенты должны храниться таким образом, чтобы коэффициенты для xiтерминов были в нуме [i] и деноме [i].
Типы коэффициентов и переменныхvмогут различаться до тех пор, пока* числои* деномконвертируются в типV. Это позволяет, например, для одной или обеих таблиц коэффициентов быть таблицей целых чисел, если это уместно.
Эти функции предназначены для безопасной оценки результата, даже когда значениеzочень велико. Таким образом, они не используют преимущества компиляции размеров временного массива для оптимизации. Эти функции лучше всего зарезервированы для ситуаций, когдаzможет быть большим: если вы можете быть уверены, что численное переполнение не произойдет, то полиномиальная оценка с размерами массивов времени компиляции может предложить немного лучшую производительность.
Полиномы оцениваются поМетод Хорнера. Если размер массива известен во время компиляции, то функции отправляются в конкретные реализации размера, которые разворачивают цикл оценки.
Рациональная оценкаМетод Хорнера: с двумя полиномами, оцениваемыми параллельно, чтобы максимально использовать процессоры с плавающей запятой. Еслиvбольше единицы, то полиномы оцениваются в обратном порядке как полиномы в1/v: это позволяет избежать ненужного численного переполнения при больших коэффициентах.
И полиномиальные, и рациональные алгоритмы оценки функций могут быть настроены с использованием различных макросов конфигурации для обеспечения оптимальной производительности для конкретной комбинации компилятора и платформы. Это включает поддержку методов Хорнера второго порядка. Различные варианты описаны здесь. Тем не менее, преимущества производительности, которые будут получены от них, являются незначительными на большинстве современных аппаратных средств, поэтому лучше всего запуститьприложение для тестирования производительностиперед изменением настроек по умолчанию.