c++ - 在 C++ 中,<、== 和 > 中的一个是否保证在 float 上为真?

标签 c++ floating-point standards floating-point-comparison

在 C++ 中,我是否可以保证,对于任何给定的 float afloat b , 一个且只有一个 a < b , a == ba > b是真的吗?

如果这在编译器和平台之间有所不同,我对 x86 上的 Visual C++ 感兴趣。

最佳答案

没有。

对于任何一个 a 来说都足够了或 b成为 NaN a < b 中的每一个, a == ba > b是假的。

如果两者都是 ab是非 NaN 则正好是 a < b 之一, a == ba > b必须是真的。

作为补充,这个 answer告诉你如何在 C++ 中获得 a NaN 值(有几个 NaN 值,可以通过检查它们的表示来区分;它们彼此不同,因为 NaN 永远不等于任何东西,)以及如何测试一个值是否为 NaN(查看变量 x 是否为 NaN 的惯用测试是 x != x ,实际上 std::isnan() 经常以这种方式实现,但有些程序员必须阅读你的代码可能会被它弄糊涂)。

然后,如果 ab是以前计算的结果,存在精度过高的问题。看到这个article在 C 中进行讨论。C99 标准通过明确规定可能和不可能出现超精度的规则解决了这个问题,但是尽管 C++ 或多或少地通过遵循 C 标准来定义 FLT_EVAL_METHOD 来继承这些规则。在 cfloat ,在实践中,C 编译器比 C++ 编译器更重视规则。例如 GCC 在使用 -std=c99 编译时实现了 C 的规则。 ,在这种情况下,您可以依赖该属性来保存,但在撰写本文时,GCC 在用作 C++ 编译器时并未实现这些规则。

关于c++ - 在 C++ 中,<、== 和 > 中的一个是否保证在 float 上为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41989570/

相关文章:

c++ - 随机二叉树中的插入函数

ruby - 指定小数点后有多少个数字

c++ - 位域,为什么特定于实现?

c++ - "new int[8]()"是否等同于 C++11 中的 "new int[8]{}"?

c++ - QScriptValue 作为全局对象的深拷贝

c++ - 具有模板参数的模板特化

带路由器的 C++ 套接字

c++ - 从 float C++ 中提取数字

python - 为什么 “np.inf//2” 导致 NaN 而不是无穷大?

c - Pebble C 将 char 转换为时间以在 double difftime(time_t end, time_t begin) 中使用