我们如何正确确定两个浮点变量是否相等?

问题描述

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

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

解决方法

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

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