【问题标题】:Fortran 1.0/0.2=4? [duplicate]Fortran 1.0/0.2=4? [复制]
【发布时间】:2015-03-29 22:24:49
【问题描述】:

代码如下:

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 只是有理数 3602879701896397/18014398509481984 的一个名称。

标签: floating-point integer fortran division floating-accuracy


【解决方案1】:

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

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 语言中也可能发生同样的事情。

【讨论】:

    【解决方案2】:

    使用 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
    

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2013-03-10
      • 1970-01-01
      相关资源
      最近更新 更多