我想用c系列计算c中的三角比率
sinx = x - x3/3! + x5/5! - x7/7! + a
并希望将我的结果与标准数学库函数进行比较。 其中a =常数
任何帮助将不胜感激!
答案 0 :(得分:2)
如果问题是如何总结系列,你可以逐个更新这个词:
double sum_the_series(double x, size_t number_of_terms)
{
const double x2 = x * x;
double term = x;
double result = term;
for (size_t i = 1; i < number_of_terms; ++i)
{
term = term * x2 / (double(2*i) * double(2*i+1));
if (i % 2 == 0) result += t;
else result -= t;
}
return result;
}
答案 1 :(得分:1)
因子趋向于变得非常快(12!不适合32位变量);如果你不太关心精度细节等等,你可以像那样实现它
double fact(unsigned int n)
{
double r = 1.0;
if (n == 0 || n == 1) return 1.0;
// memoizing here can help
while(n-- > 0) r *= (double)(n+1);
return r;
}
double part(double x, int n)
{
return (n%2 == 0? -1 : 1)*pow(x, 2*n - 1)/fact(2*n-1);
}
double sinx(double x)
{
static const double a = 0.0020202; // a number
int i;
double r = 0.0;
for (i = 1; i < MAXP; i++)
r += part(x, i);
return r + a;
}
或类似的东西(我没有测试过)。当然,这不是正确计算罪的准确方法。
除了使用函数 part ,它包含总和的单个“术语”,这是数学公式的直接(天真)明显的转换。让我们看看如何将公式放在一个更好的实现方式,并且具有更好的性能,但要尝试计算可能的1M sin-s或更多的差异。 (这个SO不能将TeX标记理解为其他SO站点吗?)
x0 = x = x/1!
x1 = -x^3/3! = -x/1! * x^2/(2 * 3) = x0 * x^2/(2 * 3)
x2 = x^5/5! = x^3/3! * x^2/(4 * 5) = -x1 * x^2/(4 * 5)
x3 = -x^7/7! = -x^5/5! * x^2/(6 * 7) = -x2 * x^2/(6 * 7)
.
.
.
xn = -x(n-1) * x^2/(2n * (2n + 1)) for n > 0
另一个答案中给出的代码是这个“公式”的翻译,而不是原始公式的翻译。因此,翻译这个公式的代码或多或少会作为另一个答案:
double sinx(double x, size_t t)
{
double term = x;
double result = term;
size_t i;
for(i = 1; i < t; i++)
{
term *= -x*x/( (double)(2*i*(2*i + 1)) );
result += term;
}
return current + trunc_err(x, t);
}
其中trunc_err是一个函数,由于系列的截断而计算错误。 (和以前一样,检查一切是否正确都留作练习)