Jur*_*c_C 99 algorithm math trigonometry
因此,在高中数学,也可能是大学,我们学习如何使用三角函数,他们做什么,以及他们解决了什么样的问题.但它们总是作为一个黑盒子呈现给我.如果你需要某些东西的正弦或余弦,你可以点击计算器上的sin或cos按钮然后进行设置.哪个好.
我想知道的是三角函数通常是如何实现的.
Joh*_*ook 141
首先,你必须做一些范围缩小.Trig函数是周期性的,因此您需要将参数减少到标准间隔.对于初学者,您可以将角度减小到0到360度之间.但是通过使用一些身份,你意识到你可以少花钱.如果计算0到45度之间角度的正弦和余弦,您可以自行计算所有角度的所有三角函数.
一旦你减少了论证,大多数芯片都使用CORDIC算法来计算正弦和余弦.你可能会听到人们说计算机使用泰勒系列.这听起来很合理,但事实并非如此.CORDIC算法更适合高效的硬件实现.(软件库可能使用Taylor系列,比如说不支持trig函数的硬件.)可能还有一些额外的处理,使用CORDIC算法得到相当好的答案,然后做其他事情以提高准确性.
上面有一些改进.例如,对于非常小的角度theta(以弧度表示),sin(theta)= theta到你拥有的所有精度,因此简单地返回theta比使用其他算法更有效.因此在实践中有很多特殊情况逻辑可以挤出所有可能的性能和准确性.市场较小的芯片可能无法进行尽可能多的优化工作.
Jas*_*n S 47
编辑:Jack Ganssle在其关于嵌入式系统的书"固件手册"中进行了不错的讨论.
仅供参考:如果您有准确性和性能限制,泰勒系列不应用于近似函数以用于数字目的.(将它们保存为微积分课程.)它们在单个点使用函数的解析性,例如,在该点存在所有其衍生物的事实.它们不一定会在感兴趣的区间内收敛.他们经常在分配函数近似值的准确性方面做得很糟糕,以便在评估点附近"完美"; 当你离开它时,错误通常会向上放大.如果你有一个具有任何非连续导数的函数(例如方波,三角波及其积分),泰勒级数将给你错误的答案.
当使用最大次数N的多项式在x0 <x <x1的区间内逼近给定函数f(x)时,最好的"简单"解是来自Chebyshev近似 ; 请参阅Numerical Recipes进行讨论.请注意,我链接到的Wolfram文章中的Tj(x)和Tk(x)使用了cos和反余弦,这些是多项式,实际上你使用递推公式来获得系数.再次,请参阅Numerical Recipes.
编辑:维基百科有一篇关于近似理论的半篇文章.他们引用的其中一个来源(哈特,"计算机近似")已经绝版(使用的副本往往很昂贵),但对这类内容进行了大量细节处理.(Jack Ganssle在他的时事通讯The Embedded Muse第39期中提到了这一点.)
编辑2:这是泰勒与切比雪夫对罪(x)的一些有形误差指标(见下文).需要注意的一些要点:
不要误会我的意思:泰勒系列适用于正弦/余弦(在-pi/2到+ pi/2范围内具有合理的精度;从技术上讲,有足够的项,你可以达到所有实际输入所需的精度,但尝试使用泰勒级数来计算cos(100),除非使用任意精度算术,否则不能这样做.如果我被困在荒岛上的非科学计算器,我需要计算正弦和余弦,我可能会使用泰勒系列,因为系数很容易记住.但是,必须编写自己的sin()或cos()函数的真实世界应用程序是非常罕见的,您最好使用有效的实现来达到所需的精度 - 泰勒系列不是这样.
范围= -pi/2到+ pi/2,度数5(3个术语)
范围= -pi/2到+ pi/2,度数7(4个术语)
范围= -pi/4到+ pi/4,3度(2个术语)
范围= -pi/4到+ pi/4,5度(3个术语)
范围= -pi/4到+ pi/4,7度(4个术语)
查看关于trig函数的Wikipedia文章.关于在代码中实际实现它们的一个好地方是Numerical Recipes.
我不是一个数学家,但是我对sin,cos和tan"来自"的理解是,从某种意义上说,当你使用直角三角形时,它们就会被观察到.如果你测量一堆不同的直角三角形的边长,并在图上绘制点,你可以得到sin,cos和tan.正如Harper Shelby指出的那样,函数被简单地定义为直角三角形的属性.
通过理解这些比率如何与圆的几何形状相关联来实现更复杂的理解,这导致弧度和所有这些优点.这就是维基百科条目中的所有内容.