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

Wil*_*ber 2 fortran do-loops

当我用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不是输出.为什么会这样?

Vla*_*r F 6

这基本上是一个舍入问题,请参阅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犯罪.