template<unsigned I>
struct factorial{
enum{
value = I * factorial<I -1>::value
};
};
template<>
struct factorial<0>
{
enum{ value = 1};
};
template<unsigned pow>
inline double power(double const& value){
return value * power<pow-1>(value);
}
template<>
inline double power<1>(double const& value){
return value;
}
template<>
inline double power<0>(double const& value){
return 1;
}
template<unsigned term>
inline double taylor_polynomial(double const& x){
return power<term>(x) / factorial<term>::value;
}
template <unsigned term>
inline double taylor_sine_term(double const& x) {
return (power<term>(-1) / factorial<(2*term)+1>::value) * power<(2*term)+1>(x);
}
template<unsigned terms>
inline double taylor_sine(double const& x){
return taylor_sine_term<terms-1>(x) + taylor_sine_term<terms>(x);
}
template <>
inline double taylor_sine<0>(double const& x) {
return taylor_sine_term<0>(x);
}
Используя следующий код, я попытался реализовать sin()
функция основана на N-членном ряду Тейлора, но когда я сравниваю результаты функции, результаты неверны, и я не уверен, почему. Выполнение следующего кода:
std::cout<<sin(2 * M_PI * 0.5)<<" "<<taylor_sine<13>(2 * M_PI * 0.5);
Результаты в 1.22465e-16 -16546.9
Насколько я знаю, я правильно рассчитываю ряды, поэтому я не уверен, что происходит не так.
Вы вызываете неправильную функцию для рекурсии:
template<unsigned terms>
inline double taylor_sine(double const& x){
return taylor_sine_term<terms-1>(x) + taylor_sine_term<terms>(x);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
Вы добавляете термин n
и срок n-1
вместо добавления термина n
и серия Тейлор n-1
термины.