c++ - 浮点数比较为什么没有相等的函数
问题描述
在浮点数的c++标准中,有std::isgreater
比较大的比较,有比较std::isless
少的,那为什么没有std::isequal
相等比较呢?是否有一种安全准确的方法来检查double
变量是否等于DBL_MAX
标准定义的常量?我们尝试这样做的原因是我们正在通过服务协议访问数据,它定义了一个双字段,当没有数据可用时它将发送DBL_MAX
,所以在我们的客户端代码中,当DBL_MAX
我们需要跳过它时,以及我们需要的任何其他内容处理它。
解决方案
, , ,与,相比的兴趣在于isgreater
,当与 NaN 进行比较时,它们不会引发 FE_INVALID(浮点异常,这些是与 C++ 异常不同的野兽,并且不会映射到 C++ 异常),而运算符会这样做。isless
isgreaterequal
islessequal
>
<
>=
<=
由于==
不引发 FP 异常,因此不需要额外的功能。
请注意,还有islessgreater
和isunordered
。
如果您不考虑 NaN 或不测试浮点异常,则无需担心这些函数。
==
如果要检查值是否相同(忽略与带符号的 0 和 NaN 相关的问题),可以考虑使用相等比较。根据您达到这些值的方式,有时考虑近似相等比较是有用的——但不建议系统地使用一个,例如,这种近似相等可能不具有传递性。
在网络协议的上下文中,您必须考虑数据是如何序列化的。如果序列化被定义为二进制,您可能可以重建确切的值,因此==
是您想要比较DBL_MAX
的值(对于其他值,检查为有符号 0 和 NaN 指定的内容,并知道有信号和安静的 NaN 表示为不同的位模式,尽管 IEEE 754-2008 现在推荐其中之一)。如果表示是十进制的,则必须检查表示是否足够精确以使DBL_MAX
值可重构(并注意舍入模式)。
请注意,我会考虑使用 NaN 来表示没有可用数据的情况,而不是使用可能有效的值。
推荐阅读
- javascript - 在 React 中从 WatermelonDB 中获取数据
- webpack - Nuxt - 模块解析失败:意外字符“#”
- c# - 获取类型而不是值
- ios - .oga 快速播放
- angular - Angular 7在重定向后保留来自URL的'objects id based'
- modelsim - 在 Modelsim 中仿真时意外退出
- c# - 如何转换字符串,使每个单词的第一个字符为大写,其余字符为小写?
- java - Apache Camel 数据库集成的优缺点
- django - 尝试访问 A2 上的 Django 应用程序时“很抱歉,但出了点问题”
- vba - 如何从文本框中获取每个单词的首字母?