【发布时间】: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。