用倍角公式解三角函数, 反三角函数.
本帖最后由 落叶 于 2017-3-13 14:17 编辑研究出一个非常有意义的方法,虽然速度很慢,以sin函数为例:精度取32,
sin(1.23e-15) = 1.2299999999999999999999999999997E-15
sin(1.23e-16) = 1.23E-16
sin(1.23e-31) = 1.23E-31,这个计算结果表明,当自变量足够小时(和精度直接相关),sin(x)的值就是x本身,用倍角公式( sin3x=3sinx-4(sinx)^3)把x分解到足够小,
此时不需要泰勒公式运算,只需要把x的值直接作为返回值用倍角公式还原,就可得到正确答案,
还原方法:
For i = 1 To y '倍角公式返回后运算部分,y为倍角公式分解次数。
x=3x-4x^3
Next
只是精度越高返回运算工作量越大,运行速度不理想。但这种算法本质上脱离了用泰勒公式解三角函数,而且是高精度算法(不是近似算法),并且还适用于其它相似的函数,如反正切函数等等。
在不使用高精度算法时也直接用cpu的加减乘除,浮点数除获得简单不错的效果。
补充内容 (2017-3-15 20:12):
x分解是不断除以3分解,返回运算才用到倍角公式,不要理解错了啊!!! 本帖最后由 zeroieme 于 2017-3-13 16:24 编辑
你这个方法的实质是取了泰勒公式第一项,看泰勒公式第1、2项\(x-\frac{x^3}{6}\)
仅当\(x^3<2^{-33} x\)有意义。并且泰勒公式中忽略的尾项将作为误差在你反复使用倍角公式时不断放大。
不如看看CORDIC
另外32位真不是什么高精度。
本帖最后由 落叶 于 2017-3-13 20:17 编辑
你说的非常好,这个算法的原理应该是不断逼近,当逼近到一定位数后,它的前方的N位数是正确的,我们要取的是这个N位的正确答案,在确定精度的情况下,倍角公式不会放大误差(我们所取数是整个数指定精度中的正确部分,所以也就没有误差),CORDIC的原理我看了一下,和我原设想不一样,另外这个算法是任意精度,不是32位,万位精度我也用实例实现过,只是太慢!具体本质上是不是泰勒展开,我还说不清楚,不过实现时用不到泰勒公式。
另外实现万位精度,x的值要分解逼近到x.xxx...e-5000. 本帖最后由 落叶 于 2017-3-13 20:21 编辑
这个算法的本质,我又想了想,我认为是三角函数的角和它的倍角之间存在着有规律的联系,这样我们才能根据其中的精度控制后的小角度值,运算后获得我们所需精度的大角度值。这种方法的实现关键点是要有精度控制。
页:
[1]