C ++泰勒系列

时间:2011-11-01 14:10:15

标签: c++

您好我已经使用过此代码,但它输出的是0.00159265而不是0.问题出在哪里?

我用泰勒的扩张来计算罪:

#include <iostream>
#include <conio.h>
using namespace std;
double sin(double x)
{
       double value = x ;
       value -=(x*x*x)/6.0 ;
       value +=(x*x*x*x*x)/120.0; 
       value -=(x*x*x*x*x*x*x)/5040.0 ;
       value +=(x*x*x*x*x*x*x*x*x)/362880.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x)/39916800.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x)/6227020800.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/1307674368000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/355687428096000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/121645100408832000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/51090942171709440000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/25852016738884976640000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/15511210043330985984000000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/10888869450418352160768000000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/8841761993739701954543616000000.0;
       return value;
}
int main()
{
 cout<<sin(3.14);
 getche();
 return 0;
}

现在:

我已经将我的点和发散半径移动到x和3.1415之间,现在已经更正了:

double sin(double x)
{
       x=x-3.1415;
       double value = x ;
       value -=(x*x*x)/6.0 ;
       value +=(x*x*x*x*x)/120.0; 
       value -=(x*x*x*x*x*x*x)/5040.0 ;
       value +=(x*x*x*x*x*x*x*x*x)/362880.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x)/39916800.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x)/6227020800.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/1307674368000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/355687428096000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/121645100408832000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/51090942171709440000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/25852016738884976640000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/15511210043330985984000000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/10888869450418352160768000000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/8841761993739701954543616000000.0;
       return value;
}

但它反过来给出了一个例子:pi / 2 = -1和3 * pi / 2 = 1。

4 个答案:

答案 0 :(得分:6)

为什么它应该完全为零? sin(pi)为零,但这不是您正在计算的内容 - 您计算的是sin(3.14)的近似值。

答案 1 :(得分:6)

因为sin(3.14) = 0.0015926529164868282,而不是零。

请注意pi - 3.14 ~ 0.0015926536...sin(pi - x) ~ x,这与您的结果一致。

Pi不是3.14

答案 2 :(得分:3)

请注意,sin(x)的扩展对于x的值很大,收敛性很差。您应该将x改为的倍数,以使x位于π的范围内。这利用了sin周期为的事实。

如果你进行了这样的转换,你可以在扩展中使用更少的术语。

我还建议将您的扩展编写为for循环。这将使您更容易进行实验,以找出获得准确答案所需的术语数。

答案 3 :(得分:3)

关于更新的代码,您的半径调整不正确。你需要移动2π弧度的倍数。你已经移动了π弧度。更一般地说,你的代码应该移动2π弧度的倍数,直到它在-π到π的范围内。这可以通过一次添加来完成。

你也应该使用准确的π值。