【问题标题】:NaN issue in fortran 90fortran 90 中的 NaN 问题
【发布时间】:2023-04-05 04:50:01
【问题描述】:

我意识到如果你写的话

    Real (Kind(0.d0))::x,y
    x = sqrt(-1.d0)
    y = sqrt(-1.d0)
    if (x == y) then
       write(*,*)'yep, they are equals', x
    endif

使用 ifort 编译正常。 但是什么也没写,条件总是false,你注意到了吗?为什么会这样?

【问题讨论】:

  • -1 的平方根是非法的。为此,您必须使用复数。此外,如果你得到 NaN(不是数字),NaN 永远不会等于 NaN。大多数程序会在第一个 NaN 上崩溃。
  • 您可以在this question 的回答中了解这一点。 NaN 不是数字,与它们的比较几乎总是返回 false。 (您从 sqrt(-1.d0) 获得的 NaN 是否与您从 0./0 获得的 NaN 相同?它们应该相等吗?为什么?)
  • 我的问题来了,因为当函数的返回值为 NaN 时,我需要执行一些操作,即if(outcome == sqrt(-1.d0) then etc.。好的@Jonathan Dursi,我或多或少地阅读了你传给我的链接(因为答案很长)。结论是要注意 Fortran 中的这些问题。 Fortran 1.d0/0.d0 等于 2.d0/0.d0。我将在 Matlab 中对此进行测试,看看它的行为。
  • @JoeCoolman:这是一个 IEEE 问题,而不是 Fortran 问题,因此 Matlab 可能会产生与 Fortran 代码相同的结果。
  • @KyleKanos - 完全正确。 Inf is 等于 Inf,但 NaN 等于 NaN(安静的 NaN 有例外),并且有很好的理由说明为什么会这样。这些都包含在 IEE754 中,几乎任何语言或包都是相同的。在 Matlab 中,您使用 isnan 来检查 NaN(出于上述原因)。在现代 fortran 中,您可以使用 use ieee_arithmetic 并使用固有的 IEEE_IS_NAN(X) 来检查 NaN。

标签: fortran90 intel-fortran


【解决方案1】:

NaN 表示不是一个数字,并且由于计算得出该结果的原因有很多,因此它们通常不会与自己进行比较。如果要进行 nan-testing,支持 f2003 标准的 fortran 编译器(大多数编译器的最新版本)在 ieee_arithmetic 模块中有 ieee_is_nan

program testnan
    use ieee_arithmetic

    real (kind=kind(0.d0)) :: x,y,z

    x = sqrt(-1.d0)
    y = sqrt(-1.d0)
    z = 1.d0

    if ( ieee_is_nan(x) ) then
       write(*,*) 'X is NaN'
    endif
    if ( ieee_is_nan(y) ) then
       write(*,*) 'Y is NaN'
    endif
    if ( ieee_is_nan(x) .and. ieee_is_nan(y) ) then
       write(*,*) 'X and Y are NaN'
    endif

    if ( ieee_is_nan(z) ) then
       write(*,*) 'Z is NaN, too'
    else
       write(*,*) 'Z is a number'
    endif

end program testnan

编译运行这个程序会得到

ifort -o nan nan.f90

 X is NaN
 Y is NaN
 X and Y are NaN
 Z is a number

不幸的是,在撰写本文时,gfortran 仍未实现 ieee_arithmetic,因此对于 gfortran,您必须使用非标准的 isnan

【讨论】:

  • 大家的出色贡献,我今天学到了新东西。
  • 我通常使用 if(x /= x) 作为我的 NaN 检查来代替 isnanieee_is_nan 调用。我想只是另一种选择。
猜你喜欢
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2012-12-21
  • 2010-10-24
  • 2012-09-03
相关资源
最近更新 更多