让我们假设您的数字a
和b
表示正确规范化的 IEEE-754 表示浮点数,并且a
也不b
是一个NaN
值。我们还假设a
和b
都是 32 位的,或者a
并且b
都是 64 位的(IEEE-754 浮点表示)。
在这种情况下,我相信(ISO C/C++ 或 CUDA C/C++)浮点相等性测试(==
)将在两个数字a
和b
位相同时返回 TRUE(否则为 FALSE)。
在 TRUE 情况下,除了一个例外,我相信可以安全地假设除了明显的条件之外没有任何其他条件:操作两侧devfun(a) == devfun(b)
的行为没有区别,也就是说,它是相同的代码,编译以相同的方式,在相同的条件下执行(例如,可能参与的其他变量、相同的 GPU 类型等),正如您在问题中指出的那样:“相同的建筑/程序”。devfun
==
devfun
一个例外是如果 的结果devfun(a)
是NaN
, since (IEEE-754) NaN != NaN
。
如果你认为你有一段代码反驳了这个断言,那会很有趣(对我来说)。
也许浮点忍者会出现并纠正我。
如果我不说浮点比较的危险,也许我也会失职。如果您对此不熟悉(大多数人永远不会a==b
建议对两个浮点数进行测试),您可以在 SO 上找到很多关于它的问题。
出于同样的原因,浮点相等比较 ( ==
) 通常是不明智的,我认为依赖上述断言,即使它是真的,也是不明智的。让我举一个例子。
假设您为架构编译代码sm_20
。现在您在设备上运行代码sm_21
。这一简单的变化可能会导致在运行时进行 JIT 编译。现在你不再运行相同的代码,所有的赌注都没有了。
所以,再一次,即使上面是真的,我认为你依赖这样的陈述是不明智的:
if a==b, then devfun(a) == devfun(b)