浮点数比较为什么没有相等的函数

flu*_*ter 4 c++ floating-point std c++11

在c++标准的浮点数中,有std::isgreater大比较,std::isless小比较,为什么没有std::isequal等式比较呢?是否有安全准确的方法来检查double变量是否等于DBL_MAX标准定义的常量?我们尝试这样做的原因是我们通过服务协议访问数据,它定义了一个双字段,当没有数据可用时它会发送DBL_MAX,所以在我们的客户端代码中,当DBL_MAX我们需要跳过它时,我们需要跳过它处理它。

APr*_*mer 6

的利息isgreaterislessisgreaterequalislessequal相比><>=<=是他们没有提出FE_INVALID(浮点异常,这些都是不同的东西比C ++异常并没有被映射到C ++异常)与NaN的比较时,同时运营商做。

由于==不引发 FP 异常,因此不需要额外的功能。

请注意,还有islessgreaterisunordered

如果您不考虑 NaN 或不测试浮点异常,则无需担心这些函数。

==如果您想检查值是否相同(忽略与带符号 0 和 NaN 相关的问题),可以考虑使用相等比较。根据您如何达到这些值,有时考虑近似相等比较是有用的——但不建议系统地使用一个比较,例如这种近似相等可能不是可传递的。

在网络协议的上下文中,您必须考虑数据是如何序列化的。如果序列化被定义为二进制,你可能可以重建确切的值,因此==是你想要的,所以比较DBL_MAX(对于其他值,检查为有符号 0 和 NaN 指定的内容,知道有信号和安静的 NaN 表示为不同的位模式,尽管 IEEE 754-2008 现在推荐其中之一)。如果表示是十进制的,则必须检查表示是否足够精确以使DBL_MAX值可重构(并注意舍入模式)。

请注意,我已经考虑使用 NaN 来表示没有可用数据的情况,而不是使用潜在的有效值。