我试图编写一些代码,使用泰勒展开计算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)
对于大多数人来说这看起来太明显了,所以没有人甚至想回答,但应该明确说明
当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