float sinx(float x)
{
static const float a[] = {-.1666666664,.0083333315,-.0001984090,.0000027526,-.0000000239};
float xsq = x*x;
float temp = x*(1 + a[0]*xsq + a[1]*xsq*xsq + a[2]* xsq*xsq*xsq+a[3]*xsq*xsq*xsq*xsq+ a[4]*xsq*xsq*xsq*xsq*xsq);
return temp;
}
这些常数如何计算?如何使用此方法计算
cos
和tan
?我可以扩展它以获得更高的精度吗?我想我需要添加更多的常量?
相对于等度的泰勒多项式,上述“快速”正弦的误差图。
最佳答案
它们是-1/6
,1/120
,-1/5040
..等等。
或更确切地说:-1/3
!,1/5!
,-1/7!
,1/9!
...等
看看syl x in here的taylor系列:
它下面有cos x:
对于cos x,如上图所示,常量为-1/2!, 1/4!, -1/6!, 1/8!
...
棕褐色x略有不同:
因此,针对cosx进行调整:
float cosx(float x)
{
static const float a[] = {-.5, .0416666667,-.0013888889,.0000248016,-.0000002756};
float xsq = x*x;
float temp = (1 + a[0]*xsq + a[1]*xsq*xsq + a[2]* xsq*xsq*xsq+a[3]*xsq*xsq*xsq*xsq+ a[4]*xsq*xsq*xsq*xsq*xsq);
return temp;
}