2017-08-08 82 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)