无法在nvfortran中使用通常的自等价性来标识nan

无法在nvfortran中使用通常的自等价性来标识nan,fortran,nan,nvidia,Fortran,Nan,Nvidia,在大多数fortran编译器中,如gfortran,为了识别小的旧nan,您可以利用nan不是自等价的事实,通过某种等价性测试进行检查。例如,如果nanny=nan,则(nanny/=nanny)应输出T。因此,对于以下代码: program test_nan implicit none real :: nanny,zero=0.0 nanny=zero/zero print*,nanny if (nanny/=nanny) then print*,"found by

在大多数fortran编译器中,如gfortran,为了识别小的旧nan,您可以利用nan不是自等价的事实,通过某种等价性测试进行检查。例如,如果
nanny=nan
,则
(nanny/=nanny)
应输出
T
。因此,对于以下代码:

program test_nan
implicit none

real :: nanny,zero=0.0


nanny=zero/zero
print*,nanny

if (nanny/=nanny) then
    print*,"found by self-equivalency"
else
    print*,"not found by self-equivalency"
end if

if (nanny-1==nanny) then
    print*,"found by perpetual transigence"
else
    print*,"not found by perpetual transigence"
end if
    
if (nanny>1000000000000.0) then
    print*,"found by big number"
else
    print*,"not found by big number"
end if

end program
如果我在gfortran中编译并运行,我会得到:

              NaN
 found by self-equivalency
 not found by perpetual transigence
 not found by big number
但是,对nvfortran执行相同的操作会得到:

             NaN
 not found by self-equivalency
 not found by perpetual transigence
 not found by big number

在nvfortran中是否有一种方法可以检查NAN?

自Fortran 2003以来,测试NAN的标准方法是通过该语言提供的IEEE 754-1985支持。下面是一个例子。注意:测试一个变量是否与它本身相等不是一个好主意,因为乐观主义者经常会删除它——这可能就是您在上面看到的。同样除以零会产生实现定义的行为,因此在这一点之后,任何事情都可能发生——下面的代码显示了生成NaN的标准方法

ijb@ijb-Latitude-5410:~/work/stack$ cat nan.f90
program test_nan

  Use, Intrinsic :: ieee_arithmetic, Only : ieee_signaling_nan, &
       ieee_support_nan, ieee_value, ieee_is_nan

  implicit none

  real :: nanny

  If( .Not. ieee_support_nan( nanny ) ) Then
     Write( *, * ) 'Processor does not support NaNs'
     Stop
  End If

  nanny = ieee_value( nanny, ieee_signaling_nan )
  If( ieee_is_nan( nanny ) ) Then
     Write( *, * ) 'Nanny is a Nan'
  Else
     Write( *, * ) 'Nanny is NOT a Nan, she is ', nanny
  End If

  nanny = 3.0
  If( ieee_is_nan( nanny ) ) Then
     Write( *, * ) 'Nanny is a Nan'
  Else
     Write( *, * ) 'Nanny is NOT a Nan, she is ', nanny
  End If

end program test_nan
ijb@ijb-Latitude-5410:~/work/stack$ gfortran --version
GNU Fortran (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ijb@ijb-Latitude-5410:~/work/stack$ gfortran -std=f2018 -Wall -Wextra -fcheck=all -O -Wuse-without-only nan.f90 -o nan
ijb@ijb-Latitude-5410:~/work/stack$ ./nan
 Nanny is a Nan
 Nanny is NOT a Nan, she is    3.00000000    
ijb@ijb-Latitude-5410:~/work/stack$ 

只需注意,这在:GNU Fortran(GCC)10.2.0和:nvfortran 21.1-0 LLVM 64位时都可以工作。谢谢你,伊恩。