gpt4 book ai didi

c++ - 使用模板 C++ 基于泰勒级数的 Sin() 实现

转载 作者:行者123 更新时间:2023-11-28 06:10:45 29 4
gpt4 key购买 nike

我正在使用模板基于泰勒级数实现 sin() 函数。到目前为止,我的代码如下:

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 <unsigned term>
inline double taylor_sine_term(double const& x) {
return (power<term>(-1) / factorial<(2*term)+1>::value) * power<(2*term)+1>(x);
}

我遇到的问题是创建函数以使用 taylor_sine_term 函数来扩展 N 项数的级数。该函数在功能上等同于以下函数。

template<unsigned terms>
inline double taylor_sine(double const& x){
return taylor_sine_term<1>(x)+taylor_sine_term<2>(x) + ... + taylor_sine_term<terms>(x);
}

基本上,我需要想出一种方法来生成一系列整数常量,这些常量可用作 taylor_sine_term 函数中 N 项的项数模板参数,并将它们加在一起。结果将扩展到 N 个项的完整泰勒级数。问题是我不知道从哪里开始。

感谢任何帮助,谢谢。

最佳答案

与您编写其他案例的方式相同:递归案例和基本案例:

template<unsigned terms>
inline double taylor_sine(double const& x) {
return taylor_sine_term<terms>(x) + // current term
taylor_sine<terms-1>(x); // rest of terms
}

template <>
inline double taylor_sine<0>(const double& x) {
return taylor_sine_term<0>(x);
}

或者,您可以使用索引序列技巧来获取所有这些:

template <unsigned terms>
inline double taylor_sine(double const& x) {
return taylor_sine(x, std::make_index_sequence<terms+1>{});
}

template <unsigned terms, size_t... Is>
inline double taylor_sine(const double& x, std::index_sequence<Is...> ) {
double res = 0.0;
for (double t : {taylor_sine_term<Is>(x)...}) {
res += t;
}
return res;

/* or in C++17
return (taylor_sine_term<Is>(x) + ...);
*/
}

请注意,您应该在 power 上更改您的基本案例成为power<0> .

关于c++ - 使用模板 C++ 基于泰勒级数的 Sin() 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31322851/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com