简单正弦函数的近似

3

我正在寻找一个在x == 0x == 90x == pi/2处准确,并且在其他情况下误差不超过5%的正弦近似值。

我没有空间用查找表。


4
标准正弦函数有什么问题? - John Zwinck
1
你可以使用泰勒级数来实现你的近似。 - Vittorio Romeo
1
我们不是编码服务,因此在这里推荐库是不相关的话题。 - too honest for this site
@JohnZwinck 可能是为了快速逼近的 SSE/AVX 实现。 - Kh40tiK
1
一个带有15个条目和线性插值的小查找表? - Jabberwocky
显示剩余4条评论
4个回答

11

3
“否则,它确实表示误差在5%以内。” - Kh40tiK
@Kh40tiK 我有意读错了,这是更好的答案。 - meaning-matters
1
在这里,您可以找到一个很好的近似值可视化,包括误差。 - flatronka
1
@flatronka 非常酷,谢谢。 - meaning-matters

5

由于 sin 的导数是 cos,而 cos 永远不会超过 1,而 5% 等于 1/20,因此具有 20 * pi / 2 = 32 个点的查找表将满足您的要求。您确定不能抽出 32 字节的 RAM 来存储它吗?


我总共有64或1KB的RAM。 - fadedbee
那其中有多少是免费的? - Dmitry Grigoryev
@meaning-matters 你的回答很棒,但是你的评论并没有为关于我的回答的讨论做出贡献,只是为了自我推广而存在。 - Dmitry Grigoryev
这是为https://hackaday.io/contest/18215-the-1kb-challenge而做的,所以我会尽力将代码大小和数据降到最低。在我能够手动优化生成的ARM汇编时,我会这样做。 - fadedbee
@chrisdew 噢,好的。当我回答这个问题时,我是在务实的心态下,但如果你确实需要节省最后一个字节,你肯定可以打败 LUT。顺便说一下,你可能想在问题中添加你正在考虑的 MCU 型号,因为最佳答案可能会因 MCU 而异。 - Dmitry Grigoryev
@DmitryGrigoryev:更可能是ROM/Flash。 - too honest for this site

1
我能想到的唯一方法是使用泰勒/麦克劳林展开式。这些形成了一个多项式,表示对函数的越来越好的逼近。
通常,您选择要通过泰勒级数近似的函数值。
例如,在弧度为0附近,sin(x) = x - x^3 / 3! + x^5 / 5!级数是无限的,您包含的术语越多,就越接近真实值。
我建议您可能需要在“方便”的位置(30,60,45,90度)形成几个这些泰勒展开式。然后使用最接近您角度的函数。

然后使用最接近于您所需角度的函数。- 像查找表一样?;-) - John Zwinck
这样做就不需要存储任何东西。只需定义4个函数并使用 if 来决定调用哪一个。 - James

0

使用快速线性拟合找到。

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

这个最大误差为3%。


谢谢,但这个与Bhaskara I的正弦逼近相比如何?看起来它需要12次乘法,而Bhaskara的则需要一次除法。 - fadedbee
@chrisdew 当然不是,因为我没有用谷歌搜索 :) - Kh40tiK
@chrisdew 也不需要12个乘法,只需像这样做:a+x*(b+x*(c+x*(...))) - Kh40tiK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接