在Fortran中使用REAL类型值作为do-loop控制变量时,为什么输出很奇怪?

时间:2017-04-03 07:01:25

标签: fortran do-loops

当我用Fortran语言编写代码时,我发现当我在do-loop中将REAL值设置为control-var时,输出很奇怪,例如:

do i=0.1,1.0,0.1
write (13,"(F15.6)") i
end do

输出值为:0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0。但是当我将起始值设置为0.6时:

do i=0.6,1.0,0.1
write (13,"(F15.6)") i
end do

输出为:0.6,0.7,0.8,0.9,并且不输出1.0。为什么会这样?

1 个答案:

答案 0 :(得分:6)

这基本上是一个舍入问题,请参阅Precision problems of real numbers in Fortran以及随后的链接。比较两个浮点是很棘手的,它与do循环不能很好地匹配。

您应该打印更多十进制数而不仅仅是6:

   0.1000000015
   0.2000000030
   0.3000000119
   0.4000000060
   0.5000000000
   0.6000000238
   0.7000000477
   0.8000000715
   0.9000000954
   1.0000001192

值不准确。

在Fortran中,在开始循环之前计算迭代次数。当你计算循环行程计数时:

write (*,"(F15.10)") (1.0 - 0.1) / 0.1

write (*,"(F15.10)") (1.0 - 0.6) / 0.1

你会得到:

   9.0000000000
   3.9999997616

所以后者将只迭代四次(3 + 1 = 4;所以i = 0.6,0.7,0.8和0.9),因为计数从3.999 ...截断到3。

真正的循环计数器已从Fortran删除,原因很充分,请勿使用它们。四舍五入是问题之一。编译器应警告您:

  

警告:删除的功能:在DO循环中的起始表达式(1)必须是   整数

此外,将real变量命名为i应该是犯罪行为。