C 正弦的简单逼近

C 正弦的简单逼近,c,trigonometry,C,Trigonometry,我在寻找正弦的近似值,它在x==0和x==90或x==pi/2时是正确的,否则在5%以内 我没有空间放查找表。您似乎可以使用: 误差保持在2%以内 非常快,可以(手动)进行优化。我认为实现这一点的唯一方法是使用Taylor/Maclaurin扩展 它们形成一个多项式,表示函数的一个不断改进的近似值 通常,您会选择一个函数的值,通过泰勒级数来近似该值 例如,大约x=0radianssin(x)=x-x^3/3!+x^5/5。级数是无限的,包含的项越多,就越接近实际值 我建议您可能必须在“方便”的位

我在寻找正弦的近似值,它在
x==0
x==90
x==pi/2
时是正确的,否则在5%以内


我没有空间放查找表。

您似乎可以使用:

误差保持在2%以内


非常快,可以(手动)进行优化。

我认为实现这一点的唯一方法是使用
Taylor/Maclaurin扩展

它们形成一个多项式,表示函数的一个不断改进的近似值

通常,您会选择一个函数的值,通过泰勒级数来近似该值

例如,大约
x=0
radians
sin(x)=x-x^3/3!+x^5/5。级数是无限的,包含的项越多,就越接近实际值


我建议您可能必须在“方便”的位置(30、60、45、90度)形成几个泰勒展开式。然后使用角度最接近的函数。

因为
sin
的导数是
cos
,永远不会超过1,5%是1/20,所以
20*pi/2=32
点的查找表可以满足您的要求。你确定连32个字节的内存都不能用来存储吗?

使用快速线性拟合

1.00003 x - 0.000312267 x^2 - 0.165537 x^3 - 0.00203937 x^4 +  0.010286 x^5 - 0.000961693 x^6

此最大错误为3%。

标准sin函数有什么问题?您可以使用Taylor系列实现近似值。我们没有编码服务,这里没有库建议。@JohnZwinck可能是为了快速近似SSE/AVX实现。一个包含say15条目的小型查找表和线性插值?它可以否则在5%以内。@Kh40tiK我误读了(故意:-)这里有一个更好的答案。你可以找到一个很好的近似可视化,包括错误。@flatronka非常酷;谢谢。我总共有64或1KB的RAM。其中有多少是免费的?@这意味着你的答案很酷,但你的评论并没有对我的答案进行讨论,只是为了自我提升。这是为了让我尽量减少代码大小和数据。我将手动优化生成的臂组件,我可以。@chrisdew哦,好吧。在回答这个问题时,我的心情是务实的,但是如果你真的需要保存最后一个字节,你肯定可以击败LUT。顺便说一句,你可能想在问题中加入你正在考虑的MCU型号,因为最好的答案可能是MCU特定的。“然后使用你角度最接近的函数。”-所以…像查找表一样?;-)你不必这样储存任何东西。只需定义4个函数,并使用
if
来决定调用哪一个函数。谢谢,但这与Bhaskara I的正弦近似值相比有竞争力吗?看起来它需要12次乘法,但Bhaskara的需要除法。@chrisdew肯定不需要,因为我没有在谷歌上搜索:)@chrisdew也不需要12次mult,只需要做一些类似
a+x*(b+x*(c+x*(…))
1.00003 x - 0.000312267 x^2 - 0.165537 x^3 - 0.00203937 x^4 +  0.010286 x^5 - 0.000961693 x^6