大角的三角函数

三角函数是种周期函数。超出周期的大角可以减去周期之后,转换到一个周期之内来计算。然而… …

现在来计算sin(100000000(弧度))的值:

a=10000.0;
a*=a;
print a;
100000000.000000

pi=3.1415926;
n = ceil(a/(2*pi));
print n;
15915495

r = a-2*pi*n;
print r;
-2.634674
print sin(r);
-0.485486

得到的结果是没有意义的,因为pi是无理数,取pi=3.1415926,误差为0.00000005。因为n很大, n * 0.00000005 = 0.795775。这样计算,误差积累就会淹没了真实值。

大角的转换还有一种办法,就是用2倍角公式。通过不断使用2倍角公式,把大角转换到基本周期之内然后求值:

print a;
100000000.000000
r= a;
while(r>pi) {
    
    
        r/=2;
        i++;
}
print r,i;
2.980232 25

利用循环把a 转换一个数列a[0],…,a[n]。a[0]=a, a[25] = 2.980232。

n=25;
i=n;
for(;i>0; i--) {
    
    
        if (i==n) {
    
    
                sin = sin(r);
        }
        cos = (1-sin*sin)**0.5;
        sin = 2*sin*cos;
        print sin, i-1;
}
0.317148 24
0.601551 23
0.961079 22
0.531039 21
0.899949 20
0.784747 19
0.972797 18
0.450711 17
0.804672 16
0.955499 15
0.563735 14
0.931240 13
0.678698 12
0.996895 11
0.156985 10
0.310077 9
0.589587 8
0.952425 7
0.580549 6
0.945396 5
0.616256 4
0.970660 3
0.466804 2
0.825647 1
0.931639 0

这样就求得了sin(100000000)的值为0.931639。计算中要小心下标i和数列a[i]的对应关系。如上面代码。循环中求出的sin(x)为下一代的sin值。所以print的时候,使用i-1。

猜你喜欢

转载自blog.csdn.net/aaasssdddd96/article/details/111058447