使用泰勒扩展计算罪的程序不起作用?

时间:2017-08-08 22:51:01

标签: fortran

我试图编写一些代码,使用泰勒展开计算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

然而,这并没有打印出任何东西?这是为什么?

1 个答案:

答案 0 :(得分:1)

对于大多数人来说这看起来太明显了,所以没有人甚至想回答,但应该明确说明

x - sin(0.75) < 10**(-6)x非常不同时,条件sin(0.75)显然不正确,因此永远不会输入do while循环。

另外,正如IanH评论10**(-6)将给出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