当我用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
。为什么会这样?
答案 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
应该是犯罪行为。