在 C++ 中,是否恰好是 <、== 和 > 中的一个在浮点数上保证为真?
In C++, is exactly one of <, == and > guaranteed to be true on floats?
在 C++ 中,我是否可以保证,对于任何给定的 float a
和 float b
,a < b
、a == b
和 [=14 中的一个且只有一个=] 是真的吗?
如果编译器和平台之间存在差异,我对 x86 上的 Visual C++ 感兴趣。
没有
a
或 b
为 NaN
就足够了,因为 a < b
、a == b
和 a > b
都为假.
如果 a
和 b
都是 non-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 标准来继承这些规则cfloat
中 FLT_EVAL_METHOD
的定义,实际上 C 编译器比 C++ 编译器更重视这些规则。例如,当使用 -std=c99
编译时,GCC 实现了 C 的规则,在这种情况下,您可以依赖 属性 来保持,但是在撰写本文时,GCC 在用作 C++ 时并未实现这些规则编译器。
在 C++ 中,我是否可以保证,对于任何给定的 float a
和 float b
,a < b
、a == b
和 [=14 中的一个且只有一个=] 是真的吗?
如果编译器和平台之间存在差异,我对 x86 上的 Visual C++ 感兴趣。
没有
a
或 b
为 NaN
就足够了,因为 a < b
、a == b
和 a > b
都为假.
如果 a
和 b
都是 non-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 标准来继承这些规则cfloat
中 FLT_EVAL_METHOD
的定义,实际上 C 编译器比 C++ 编译器更重视这些规则。例如,当使用 -std=c99
编译时,GCC 实现了 C 的规则,在这种情况下,您可以依赖 属性 来保持,但是在撰写本文时,GCC 在用作 C++ 时并未实现这些规则编译器。