【发布时间】:2020-11-12 10:22:08
【问题描述】:
我正在 Fortran90 中做一个程序,它从 i=1 到 i=n 求和,其中给出了 n。总和是sum_{i=1}^{i=n}1/(i*(i+1)*(i+2))。这个和收敛到 0.25。这是代码:
PROGRAM main
INTEGER n(4)
DOUBLE PRECISION s(4)
INTEGER i
OPEN(11,FILE='input')
OPEN(12,FILE='output')
DO i=1,4
READ(11,*) n(i)
END DO
PRINT*,n
CALL suma(n,s)
PRINT*, s
END
SUBROUTINE suma(n,s)
INTEGER n(4),j,k
DOUBLE PRECISION s(4),add
s=0
DO k=1,4
DO j=1,n(k)
add=1./(j*(j+1)*(j+2))
s(k)=s(k)+add
END DO
END DO
END SUBROUTINE
输入
178
1586
18232
142705
output 文件现在是空的,我需要对其进行编码。我只是打印结果,它们是:
0.249984481688 0.249999400246 0.248687836759 0.247565846142
问题在于变量add。当j 较大时,add 变为负数,并且总和不能很好地收敛。我该如何解决?
【问题讨论】:
-
@KenY-N 不是在
READ(11,*) n(i)中初始化的n? -
文件
input中的值是什么?请将文件添加到问题中。结果是什么(PRINT*,n和PRINT*, s的结果)?也请添加到问题中。 -
是
j*(j+1)*(j+2)溢出整数变成负数的问题吗?如果n(k)大约大于最大整数值的立方根,那么可能存在溢出,导致负数? -
根本不是一个好的解决方案,但可以写:
add=((1./j)/(j+1))/(j+2)(免责声明,未测试)。 -
由于 KenY-N 给出的原因而失败,
1./j*(j+1)*(j+2)术语中存在整数溢出,因此环绕为负数。请注意,您的计算是在real中执行的,而不是在double precision中执行的。更好的是add=((1.d0/j)/(j+1))/(j+2)
标签: fortran