令人困惑的退货声明

时间:2008-10-03 00:14:29

标签: java floating-point operator-precedence

我无法准确理解IF语句的作用,我可以看到它正在检查变量x是否等于int 0。如果这是true,则返回变量y的ABSOLUTE值...这是当我丢失情节时,为什么return语句会继续包含<= ESPILON?当然这意味着小于或等于epsilon的价值?如果是这样的话怎么样?如果这并不意味着它意味着什么?

(JAVA CODE)

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

8 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:5)

如果y的绝对值是&lt; = EPSILON,则返回true,否则返回false。在return语句之前评估&lt; =。此代码是等效的:

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语句具有非常低的优先级。所有运算符如+, - ,&lt;,&gt; =都会在它之前进行评估。

答案 2 :(得分:5)

整个表达

Math.abs(y) <= EPSILON
应首先评估

,这意味着该函数将返回一个布尔值(true / false)。话虽如此,如果

x != 0

然后我不确定会得到什么。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

它返回一个布尔值。

Epsilon是双倍的,持有1E-14的价值。

这是实际的IF声明

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

所以,如果y的绝对值小于或等于Epsilon,那么返回的是什么。

答案 5 :(得分:0)

我很长时间没有使用Java,但看起来这实际上是返回一个布尔值(可能是隐式转换)。

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

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

答案 6 :(得分:0)

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

Here你可以找到所有优先级高的java运算符列表,here用于比较同一个C / C ++表

答案 7 :(得分:0)

相当于这个

return (Math.abs(y) <= EPSILON);
为了清楚起见,应将

添加到代码中。如前所述,它返回一个布尔值。

替代方案是

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;