我意识到如果你写
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 ,你注意到了吗?为什么会这样呢?
答案 0 :(得分:12)
NaN表示不是一个数字,并且由于计算可以给出该结果有许多不同的原因,因此它们通常不会对自己进行比较。如果你想进行纳米测试,支持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
。