46

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

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

4

1 回答 1

75

不。

对于其中一个ab对于其中NaN的每一个a < ba == b并且a > b为假就足够了。

如果两者ab都是非 NaN ,那么a < b, a == bora > b中的一个必须为真。

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

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

于 2017-02-01T20:56:10.563 回答