1

我无法准确理解 IF 语句在做什么,从我可以看到它正在检查变量x是否等于 int 0。如果这是返回true变量的绝对值y......这是我失去情节的时候,为什么 return 语句会继续包含<= ESPILON?当然这意味着小于或等于 epsilon 的值?如果是这样,那是如何工作的?如果不是这个意思,那又是什么意思?

(JAVA代码)

final double EPSILON = 1E-14;
if (x == 0)
    return Math.abs(y) <= EPSILON;
4

8 回答 8

12

浮点数学本质上是不准确的,因此开发人员选择了一个小数(在这种情况下为 1x10^-14)作为接近零的可接受容差,而不是测试等价性(这总是一个坏主意) . return 语句返回一个比较,所以它的作用是取 y 的绝对值,当且仅当它足够接近零时返回 true,其中足够接近由 EPSILON 定义。

于 2008-10-03T00:17:44.183 回答
5

如果 y 的绝对值 <= EPSILON,则返回 true,否则返回 false。<= 在 return 语句之前进行评估。这段代码是等价的:

if(x == 0)
{
   boolean ret = Math.abs(y) <= EPSILON;
   return ret;
}

代码不是简单地从左到右读取的。一个更简单的例子是

int x = 3 + 4 * 5;

在评估之后,x 是 23,而不是 35。评估是 3 + (4*5),而不是 (3+4)*5,因为 * 的优先级高于 +。原始示例中的 return 语句具有非常低的优先级。+、-、<、>= 等所有运算符都在它之前进行评估。

于 2008-10-03T00:16:23.737 回答
5

整个表达式

Math.abs(y) <= EPSILON

应该首先评估,这意味着该函数将返回一个布尔值(真/假)。话虽如此,如果

x != 0

那么我不确定会返回什么。

于 2008-10-03T00:17:36.540 回答
1

你是对的,它正在检查变量 x 是否等于(嗯,也许是 int)0。但是,如果这是真的,那么它不会返回 y 的绝对值,它会返回一个布尔值,即<= 运算符。

于 2008-10-03T00:16:54.310 回答
1

它返回一个布尔值。

Epsilon 是一个双精度数,其值为 1E-14。

这是实际的 IF 语句

if (x==0) {
    return MATH.abs(y) <= EPSILON;
}

因此,返回的是 y 的绝对值是否小于或等于 Epsilon。

于 2008-10-03T00:17:24.887 回答
0

我已经很久没有使用 Java 了,但看起来这实际上是在返回一个布尔值(可能是隐式转换的)。

我会说,如果 x 等于 0,则当 y <= Epsilon 的绝对值时返回 true,否则返回 false。

但是,如果 x 不等于 0,那么它将返回 null,因为没有语句涵盖 else。

于 2008-10-03T00:18:38.440 回答
0

“问题”是这个片段严重依赖于运算符优先级(本身并不坏,但有时它可能会令人困惑)。

在这里,您可以找到所有 java 运算符及其优先级的列表,并在此处比较 C/C++ 的同一张表

于 2008-10-03T09:19:48.410 回答
0

相当于这个

return (Math.abs(y) <= EPSILON);

为了清楚起见,应该将其添加到代码中。如前所述,它返回一个布尔值。

一个替代方案是

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
于 2008-10-03T13:23:17.287 回答