首页 文章

Fortran循环不起作用

提问于
浏览
2

Fortran在运行此命令时返回一条错误消息,指出浮点溢出

program single
implicit none
integer :: n,k
real, dimension(255) :: x
n = 255
x(1) = 1/3.0
x(2) = 1/12.0
do k = 3,n
  x(k) = 2.25*x(k-1) - 0.5*x(k-2)
end do
print *,x
end program

经过一些测试,我认为这是由于do循环中的变量索引,但我不太清楚问题是什么 . 谁能帮我?

1 回答

  • 3

    通过在循环期间打印 x 的值,您可以了解正在发生的事情 . 前几个值是

    2.08333284E-02
    5.20832092E-03
    1.30205788E-03
    3.25469766E-04
    8.12780345E-05
    2.01406947E-05
    4.67754580E-06
    4.54130713E-07
    -1.31697880E-06
    -3.19026776E-06
    -6.51961273E-06
    -1.30739954E-05
    

    注意符号如何变化,值从那里单调增加 . 您可能已经注意到,对于 x 的负值,您定义的序列呈指数级增长,因此一旦您变为负值,指数增长很快就会获得并导致浮点溢出,因为 x 只是增长和增长(在100次迭代之后)已超出 1E+21 ) .

    但是,让我们看看如果我们通过指定增加浮点精度会发生什么

    Integer, Parameter :: wp = Selected_real_kind( 13, 70 )
    real(kind=wp), dimension(255) :: x
    

    如果我们现在编译并运行相同的程序,我们会注意到 x(k) 为0以增加 k ,但不会在255次迭代中更改符号 . 所以事实上,你看到的溢出是由浮点表示的准确性不足引起的,这导致了错误的符号变化,以及随后的指数增长 .

相关问题