我无法准确理解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;
有帮助吗?

解决方案

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

其他提示

如果y的绝对值<!> lt; = EPSILON,则返回true,否则返回false。在返回语句之前计算<!> 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; =都会在它之前进行评估。

整个表达

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

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

x != 0

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

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

它返回一个布尔值。

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

这是实际的IF声明

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

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

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

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

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

<!> quot; issue <!> quot;是这个片段严重依赖于运算符优先级(本身并不坏,但有时它可能会令人困惑)。

此处您可以找到所有具有优先级的java运算符,以及此处,以便与C / C ++相同的表进行比较

相当于这个

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

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

替代方案是

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top