2017-08-08 61 views
0

我想寫一些代碼,它會使用泰勒展開計算sin(0.75)的值,並打印每個迭代,直到使用展開計算出的值與使用Fortran內在罪計算出的值之間的絕對差值功能小於1E-6。這是我的代碼:使用泰勒展開法計算Sin的程序不工作?

program taylor 
implicit none 
real :: x = 0.75 
do while (x - sin(0.75) < 10**(-6)) 
    print *, x 
    x = x - ((x**3)/6) + ((x**5)/120) - ((x**7)/5040) 
end do 
end program taylor 

但是,這不打印任何東西了嗎?爲什麼是這樣?

+0

真的嗎?你在問爲什麼沒有執行這個條件循環中的代碼? –

回答

1

它看起來太明顯,大多數人因此沒有人甚至想回答,但應該明確地說

條件x - sin(0.75) < 10**(-6)顯然與事實不符時xsin(0.75)很大的不同,所以do while循環是永遠進入。

此外,由於IanH評論10**(-6)將給出0,因爲兩個整數的冪的結果又是一個整數。數字10^-6的文字real應該表示爲1e-6

如果將其更改爲x - sin(0.75) > 1e-6循環將繼續,但它將永遠運行,因爲您的迭代是錯誤的。泰勒系列的工作方式不同,你應該計算

y = 0 
y = y + x**1/1! 
y = y - x**3/3! 
y = y + x**5/5! 
y = y - x**7/7! 
... 

等等,這是一種非常不同的循環。

試試這個:

program taylor 
implicit none 
real :: x = 0.75 
real :: y, fact 
integer :: sgn, i 

fact = 1 
sgn = 1 

y = 0 

    do i = 1, 10, 2 
    y = y + sgn * x**i/fact 
    fact = fact*(i+1)*(i+2) 
    sgn = -sgn 
    end do 
    print *, y, sin(x) 
end program taylor 
+2

也是10 **( - 6)== 0. – IanH

+0

也值得注意的是,當你想要比較兩個實數來檢查它們之間的差異是否足夠小時,你通常希望得到差值的大小,例如'abs(ab)