2017-08-08 13 views
0

私はテイラー展開を使ってsin(0.75)の値を計算し、展開を使って計算された値とFortranの本質的なsinを使って計算された値の絶対差がなくなるまで各繰り返しを出力するコードを書こうとしています関数は1E-6未満です。ここに私のコードです:テイラー展開を使用して罪を計算するためのプログラムが機能していませんか?

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

それはとても誰でもお答えしたかったが、sin(0.75)とは非常に異なったときにx条件x - sin(0.75) < 10**(-6)は明らかに真実ではないので、do whileループは決してありません明示的に

指摘しておかなければ、ほとんどの人にあまりにも明白に見えます入力されました。

また、IanHのコメント10**(-6)は、2つの整数の累乗の結果が再び整数であるため、0を返します。リテラルrealの番号10^-6は、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

2つの実数を比較してそれらの差が十分小さいことを確認したいときは、一般に差の大きさ(例えば、 'c = 1e-6'と' b = 1'を考えてください)、2番目の例は、 'a'' <1+ 1e-6 '、例えばa = -100)。 –

関連する問題