程序计算罪(0.75)接近,但不起作用?

时间:2017-08-12 23:57:35

标签: fortran gfortran fortran90

我已经发布了一个关于这个问题的问题,并实现了我从答案中学到的东西。我现在处于一个点,在屏幕上打印的答案非常接近,但不正确。这是我现在的代码:

program taylor
implicit none
integer :: k = 0
real :: y = 0.75
real :: x = 0.75
do while (abs(y - sin(0.75)) > 1E-6)
 k = k + 1
 y = y + ((y * (-x * x)) /( 2 * k * (2 * k + 1 )))
 print *, y
end do
end program taylor

我似乎无法在这里发现错误,为什么这不起作用?它打印的第一个答案是正确的,但随后似乎逐渐降低,而不是接近真实值。 (do while循环用于确保当计算和内部sin函数之间的绝对值小于1E-6时程序停止)。我可以看到程序不断减少最终输出,并且Taylor系列假设在 - 和+之间交替,那么如何在程序中编写呢?

感谢。

1 个答案:

答案 0 :(得分:0)

泰勒系列使用x的幂数和幂。

taylor_sin(x)= sum [0-> n]([(-1 ^ n)/(2n + 1)!] * x **(2n + 1))

(抱歉我的键盘数学技巧很差......)

program taylor
implicit none
integer :: n = 0
real :: fac = 1
real :: y = 0.75
real :: x = 0.75
real :: px = 1
integer :: sgn = -1
integer :: s = 1 
do while (abs(y - sin(0.75)) > 1E-6)
 n = n + 1
 fac = fac * (2 * n) * ((2 * n) + 1)
 px = px * (x * x)
 s = s * sgn
 y = y + ((s /fac) * (px * x))
 print *, y
end do
end program taylor

在循环中计算阶乘fac相当简单。

要计算x **(2n + 1),计算并保持x **(2n)并添加x的额外乘法。

我使用整数来计算-1 ** n,因为使用真实的可能会随着时间的推移而失去精度。

[编辑]愚蠢的我...你可以通过在循环之前将px设置为0.75来将额外的乘法保存为x。