语言 1.0/0.2=4?

Fortran 1.0/0.2=4?

代码如下:

program error
implicit none
real :: l,h
integer :: r
l=1.0
h=0.2
r=l/h
print*,r
end program error

问题是答案是4。当我明确地用1.0除以0.2时,答案是5,但是当我使用符号时,答案是4。另外,例如1.0/hl/0.2也是4。我真的很困惑。 当我将 r 定义为实数时,问题就消失了;但我需要它是一个整数,因为我将使用这些变量来定义一个二维数组。

您遇到了实数四舍五入的问题。

0.2 不是一个可以用二进制精确表示的数字,所以 1/0.2 也不完全是 5,但可以略有不同。因此,它可能被评估为 4.999997(或类似的东西)。

其次,将实数分配给整数会截断,因此在您的情况下,它可能恰好是 4 而不是 5。如果您想分配给最接近的整数,请改用 r = nint(l/h)

另请阅读What Every Computer Scientist Should Know About Floating Point Arithmetic

这与Fortran具体无关,是浮点运算的通用属性。例如,在 C 中可能会发生同样的事情。

使用NINT(最接近的整数)函数获取最接近的整数。您的代码的问题在于,将整数变量设置为实数,甚至略小于 5 也会将其设置为 4,如下面的程序所示。由于浮点运算的精度有限,表达式 1.0/0.2 可能会计算为略小于 5。

program error
implicit none
real :: l,h
integer :: r
l=1.0
h=0.2
r=nint(l/h)
print*,r ! gives 5
r = 4.99999
print*,r ! gives 4
end program error