当我用Fortran语言编写代码时,我发现当我在do-loop中将REAL值设置为control-var时,输出很奇怪,例如:
do i=0.1,1.0,0.1
write (13,"(F15.6)") i
end do
Run Code Online (Sandbox Code Playgroud)
输出是: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
Run Code Online (Sandbox Code Playgroud)
输出是:0.6,0.7,0.8,0.9,而1.0不是输出.为什么会这样?
这基本上是一个舍入问题,请参阅Fortran中实数的精度问题以及随后的链接.比较两个浮点是棘手的,它与do循环不能很好地匹配.
你应该打印更多的十进制数而不仅仅是6:
0.1000000015
0.2000000030
0.3000000119
0.4000000060
0.5000000000
0.6000000238
0.7000000477
0.8000000715
0.9000000954
1.0000001192
Run Code Online (Sandbox Code Playgroud)
值不准确.
在Fortran中,在开始循环之前计算迭代次数.当你计算循环行程计数时:
write (*,"(F15.10)") (1.0 - 0.1) / 0.1
write (*,"(F15.10)") (1.0 - 0.6) / 0.1
Run Code Online (Sandbox Code Playgroud)
你会得到:
9.0000000000
3.9999997616
Run Code Online (Sandbox Code Playgroud)
因此后者将只迭代四次(3 + 1 = 4;因此i = 0.6,0.7,0.8和0.9),因为计数从3.999 ...截断到3.
真正的循环计数器已从Fortran中删除,原因很充分,请勿使用它们.四舍五入是问题之一.编译器应该警告你:
警告:已删除的功能:DO循环中的起始表达式(1)必须为整数
另外,将real变量命名为i犯罪.