在 C++ 中,我是否可以保证,对于任何给定的 float a
和 float b
, 一个且只有一个 a < b
, a == b
和 a > b
是真的吗?
如果这在编译器和平台之间有所不同,我对 x86 上的 Visual C++ 感兴趣。
最佳答案
没有。
对于任何一个 a
来说都足够了或 b
成为 NaN
a < b
中的每一个, a == b
和 a > b
是假的。
如果两者都是 a
和 b
是非 NaN 则正好是 a < b
之一, a == b
或 a > b
必须是真的。
作为补充,这个 answer告诉你如何在 C++ 中获得 a NaN 值(有几个 NaN 值,可以通过检查它们的表示来区分;它们彼此不同,因为 NaN 永远不等于任何东西,)以及如何测试一个值是否为 NaN(查看变量 x
是否为 NaN 的惯用测试是 x != x
,实际上 std::isnan()
经常以这种方式实现,但有些程序员必须阅读你的代码可能会被它弄糊涂)。
然后,如果 a
和 b
是以前计算的结果,存在精度过高的问题。看到这个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/