程序计算 sin(0.75) 关闭,但不工作?

Program to calculate sin(0.75) close, but not working?

我已经发布了关于此问题的问题,并实施了我从答案中学到的知识。我现在正处于屏幕上打印出的答案非常接近但不正确的地步。这是我现在拥有的代码:

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时程序停止)。我可以看到程序在不断减少最终输出,泰勒级数假设在 - 和 + 之间交替,那么我的程序怎么写呢?

谢谢。

泰勒级数使用阶乘和 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 的额外乘法。