用递归法,求sin的值(或cos)。tag:递归,二分

来源:互联网 发布:武汉育才行知小学英文 编辑:程序博客网 时间:2024/05/16 05:35

        这个方法,可以用来手工计算sin值,当然,这里介绍的是用来编程的。

        计算sin的值,普通点呢,直接用math函数(相当于直接用计算器)。文艺点呢,一般也会用泰勒公式。下面这个就有点……

        怎么个递归法。这个要怎么做呢。比如说,我现在要求65度的sin值。

        sin值是直角边除以斜边。需要知道的就是y值和斜边长度。好,我们把斜边的长度值固定为10000,做个圆

        0度角我们定义为点a{10000,0},90度的为b{0,10000}。注意,这是度数,同时可以表示两条直线。他们的夹角是90度,那么角平分线是45度。角平分线与圆的交点(定义为c),就可以表示角平分线这一条直线。c怎么求呢。注意,ab都在圆上,那么ab连线的中点,与原点的连线,就是角平分线(因为a和b一样长,几何原理不多解释)。ab连线的中点的坐标,就是{5000,5000}(这个不用解释吧……{(x1+x2)/2,(y1+y2)/2})。好,勾股定理可以求出这个中点与原点连线的长度。5000*5000+5000*5000然后开根号(正常人都知道这里只要5000乘个根号二……),约等于7000吧(计算机算的肯定准确点了(用double型))。我们知道圆的半径是10000。那么点c的横竖坐标,相当于中点坐标按比例放大,然后与圆的交点即为c。这个比例就是长度/半径,在这里即是7000/10000。点c的坐标就是(5000*10000/7000,5000*10000/7000),约等于{7000,7000}。这里就不精确了,只讲道理。

        好,65度比45度大,说明65度在c和b之间的夹角。变c为a,求新的a2b2的角平分线。新的角平分线与x轴的夹角就是新角平分线的度数,为45+45/2≈67。

        65比67小了,说明在新的a2c2之间,变c2为b,求新的a3b3的角平分线(67-45/2/2≈56度)。

        剩下的不解释了,这个角平分线可以无限逼近65度。到某个精度范围后,角平分线的y坐标除以10000(斜边长)就是65度的sin值了。

        cos(x/10000)、大角度的sin(用180度减一下,再求),都可以这么逼近

        算法是递归,思想类似于二分查找法

原创粉丝点击