在 C++ 中,我是否可以保证,对于任何给定的float a
and float b
,一个且只有一个a < b
, a == b
anda > b
是真的?
如果这在编译器和平台之间有所不同,我对 x86 上的 Visual C++ 很感兴趣。
在 C++ 中,我是否可以保证,对于任何给定的float a
and float b
,一个且只有一个a < b
, a == b
anda > b
是真的?
如果这在编译器和平台之间有所不同,我对 x86 上的 Visual C++ 很感兴趣。
不。
对于其中一个a
或b
对于其中NaN
的每一个a < b
,a == b
并且a > b
为假就足够了。
如果两者a
和b
都是非 NaN ,那么a < b
, a == b
ora > b
中的一个必须为真。
作为补充,这个答案告诉您如何在 C++ 中获得NaN值(有几个 NaN 值,可以通过检查它们的表示来区分;它们彼此不同,因为 NaN 永远不等于任何东西,)以及如何您可以测试一个值是否为 NaN(查看变量x
是否为 NaN 的惯用测试是x != x
,并且确实std::isnan()
经常以这种方式实现,但一些必须阅读您的代码的程序员可能会被它混淆)。
然后,如果a
和b
是先前计算的结果,则存在精度过高的问题。有关 C 中的讨论,请参阅本文FLT_EVAL_METHOD
。C99 标准通过明确规定可能和不可能发生超精度的规则来解决该问题,但是尽管 C++ 通过遵循 C 标准对in的定义或多或少地继承了这些规则cfloat
,实际上,C 编译器比 C++ 编译器更重视规则。例如,GCC 在使用 编译时实现了 C 的规则-std=c99
,在这种情况下,您可以依赖该属性来保存,但在撰写本文时,GCC 在用作 C++ 编译器时并未实现这些规则。