1

我习惯于将浮点数与以下函数进行比较。但是,我只是检查 c++11 是否提供了一些浮点比较函数,例如isgreaterequal. 我的问题是我是否应该用标准中的功能替换它?

bool isEqual(double lhs, double rhs, double epsilon = /std::numeric_limits<double>::epsilon())
{
    if (lhs == rhs)
    {
        return true;
    }

    return fabs(lhs - rhs) <= ( (fabs(lhs) > fabs(rhs) ? fabs(rhs) : fabs(lhs)) * epsilon);
}
4

1 回答 1

1

根据:cplusplus.com

使用isgreaterequal,如果任一参数为NaN,则比较结果为假。

使用>=,如果任一参数为NaN,则将引发FE_INVALID异常。

所以,我认为你应该保持你的函数原样,因为你可能想知道你的一个论点是否是NaN.

来自 C11 Draft N1570:
p.516 Section F.9.3 关系运算符

x < y → isless(x,y) (对于 ≤, >, ≥ 也类似)虽然数值相等,但由于 x 或 y 为 NaN 且 FENV_ACCESS pragma 的状态为 '' 时的副作用,这些表达式并不等价上''。如果 FENV_ACCESS pragma 的状态为“off”,则可以执行这种转换,如果需要额外的代码来导致无序情况的“invalid”浮点异常,这将是可取的。

于 2013-09-06T02:52:00.207 回答