在 C++ 中,我是否可以保证,对于任何给定的float aand float b,一个且只有一个a < b, a == banda > b是真的?
如果这在编译器和平台之间有所不同,我对 x86 上的 Visual C++ 很感兴趣。
在 C++ 中,我是否可以保证,对于任何给定的float aand float b,一个且只有一个a < b, a == banda > b是真的?
如果这在编译器和平台之间有所不同,我对 x86 上的 Visual C++ 很感兴趣。
不。
对于其中一个a或b对于其中NaN的每一个a < b,a == b并且a > b为假就足够了。
如果两者a和b都是非 NaN ,那么a < b, a == bora > 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++ 编译器时并未实现这些规则。