首页 > 解决方案 > 浮点数比较为什么没有相等的函数

问题描述

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

标签: c++c++11floating-pointstd

解决方案


, , ,与,相比的兴趣在于isgreater,当与 NaN 进行比较时,它们不会引发 FE_INVALID(浮点异常,这些是与 C++ 异常不同的野兽,并且不会映射到 C++ 异常),而运算符会这样做。islessisgreaterequalislessequal><>=<=

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

请注意,还有islessgreaterisunordered

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

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

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

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


推荐阅读