c++ 比较两个可能是NaN的变量是否相等的正确方法是什么?

qeeaahzv  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(145)

我在我工作的代码库中发现了一个错误,他们使用first == second检查两个双精度(first, second)是否相等,但这两个变量可能是NaN
如果两个变量都是NaN,则等式为false
所以我现在的解决方案是

first == second

我们使用

(first == second || (std::isnan(first) && std::isnan(second))

有更简单的方法吗?

wwodge7n

wwodge7n1#

首先,评估如果两个值都是NaN,您是否确实“希望"条件运行。NaN是一个很好的指示器,表明出现了严重错误,而不是null或空状态。如果您的意图是要有两个可能存在也可能不存在的值,您可以考虑将它们更改为std::optional<double>以明确这一点。否则,如果您确定,那么你所做的就是正确的,没有什么魔术可以使NaN比较工作,即使你找到了一个库,抽象了它,它仍然会做你刚才在引擎盖下做的事情。

brccelvz

brccelvz2#

不要使用过于笼统的表达方式:

(first == second || (std::isnan(first) && std::isnan(second))

使用命名函数开始:

inline bool areFloatPointComparablyEquivelent(double lhs, double rhs)
{
      // Add a long very detailed explanation of why you need
      // This expression (in two years you will not be here and the
      // the next maintainer may own an axe and know where you live).

      // The exact reason or expression is not that important.
      // What is important (if not trivial, obvious) is a WHY.
      return result;
}

现在,在任何需要进行测试的地方(即使只是在一个地方)都可以使用这个自文档化函数。

相关问题