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