【问题标题】:How can we correctly determine if two floating point variables are equal? [closed]我们如何正确判断两个浮点变量是否相等? [关闭]
【发布时间】:2021-02-13 20:46:25
【问题描述】:

我正在做一个测验,我想知道我是否能正确确定它。这些是选项:

See if a == b is true
Check if a - b == 0 is true
Check if ((a-b)*(a-b))/(a*a + b*b) is close to or is zero
Check a*b == a*a is true
None of the above

我尝试在 C++ 中比较浮点值和双精度值,但我没有成功使用任何给定的公式。我会说“以上都不是”,但我不知道它在其他语言中是如何工作的。我在某处读到 Java 可能会有所不同,但我会选择最后一个选项,因为通常其他答案是不正确的。你怎么看?

【问题讨论】:

  • “没有成功”是什么意思?你究竟尝试了什么,结果是什么,为什么结果不是你想要的?

标签: math floating-point compare computer-science


【解决方案1】:

浮点比较操作是“完美的”,因为当且仅当测试的关系为真时,它才返回真。从来没有任何舍入错误。有不正确的民间传说,您不能比较浮点数或需要使用一些容差来比较它们,但这是因为准备操作数以进行比较的早期操作通常存在舍入错误,类似于 7/3 舍入到 2 的方式在整数算术中。

如果您的测验基于正确的浮点运算原理,那么“看看a == b 是否为真”是正确的。否则,答案不明确,测验可疑。

【讨论】:

  • 除了a,b 无限,a - b == 0 怎么会失败?没有最好的舍入值较小或缺乏无穷大?
  • @chux:在 IEEE-754 中,∞−∞→NaN 可能会失败,正如您所指出的,但并非如此。它在没有次正规函数的浮点运算中可能会失败(a≠b,但 a−b 太小了,它必须舍入为零)。在将次正常结果刷新为零的不合格实现中,它可能会失败。 NaN 问题应该足以取消它作为测验答案的资格。
  • @chux-ReinstateMonica 这是一个具体的例子。采用单精度浮点数 a = 8.414285e-37 和 b = 8.362857e-37。这些都不正常。它们的区别是5.142788e-39,这是一个次正规值,因此如果系统不支持次正规,则可以四舍五入为零。但是,您是正确的,排除无穷大,在支持次正规的系统中 a == b 和 a - b == 0 在逻辑上是等价的。
  • @alias 抱歉,我的“小值舍入不是最好的”并没有表明我已经考虑过这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多