【问题标题】:In C++, is exactly one of <, == and > guaranteed to be true on floats?在 C++ 中,<、== 和 > 中的一个是否保证在浮点数上为真?
【发布时间】:2017-06-18 18:40:15
【问题描述】:

在 C++ 中,我是否可以保证,对于任何给定的 float afloat ba &lt; ba == ba &gt; b 中的一个且只有一个是正确的?

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

【问题讨论】:

  • 如果您的浮点数是 NaN,则不会。
  • 您可能想将其修改为“非 NaN 浮点值”以排除极端情况?
  • 不,最多有一个保证是真的。

标签: c++ floating-point standards floating-point-comparison


【解决方案1】:

没有。

对于a &lt; ba == ba &gt; b 中的每一个,ab 为 false 就足够了。

如果ab 都是非NaN,那么a &lt; ba == ba &gt; b 中的一个必须为真。

作为补充,这个answer 告诉你如何在 C++ 中获得 a NaN 值(有几个 NaN 值,可以通过检查它们的表示来区分;它们都不同于每个其他,因为 NaN 永远不等于任何东西,)以及如何测试值是否为 NaN(查看变量 x 是否为 NaN 的惯用测试是 x != x,实际上 std::isnan() 经常实现这个方式,但是一些必须阅读您的代码的程序员可能会对此感到困惑)。

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

【讨论】:

  • 0.0 / 0.0 这样的东西不会得到 a NaN 吗?
  • @JeppeStigNielsen 是的,这是一种不依赖任何标题的编写方式。
  • @JeppeStigNielsen:取决于您的 FPU 设置,可能会产生 FPU 异常而不是 NaN。
  • GCC WRT C 和 C++ 的行为差异是否记录在任何地方?是不是和this有关?
  • @Ruslan 是的,这个答案的最后一部分描述的问题与您链接到的常见问题解答条目的第一部分完全相同。 Joseph Myers 在为 C 实现 -fexcess-precision=standard 时说,C++ 还不支持它:gcc.gnu.org/ml/gcc-patches/2008-11/msg00105.html。 FAQ 的第二部分影响浮点 表达式 的计算方式,因此它不会妨碍 lvalues 的比较。在任何情况下,使用 GCC,-ffp-contract=off 可以防止常见问题解答第二部分中的问题。
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2019-03-27
  • 2012-09-07
  • 1970-01-01
相关资源
最近更新 更多