语言 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/h
和l/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
代码如下:
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/h
和l/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