令人困惑的退货声明

时间:2020-03-06 15:03:26  来源:igfitidea点击:

我无法确切了解IF语句在做什么,从我看到的内容是它正在检查变量x是否等于int0。如果是true,则返回变量y的绝对值...这是我丢失图时的原因,为什么return语句随后继续包含<= ESPILON`?当然,这意味着小于或者等于epsilon的值吗?如果可以的话,那怎么做?如果不是那意味着什么?

(JAVA代码)

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

解决方案

如果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语句的优先级非常低。像+,-,<,> =之类的所有运算符都将在运算符之前进行求值。

我们说对了,它正在检查变量x是否等于(好吧,也许是int)0。但是,如果为true,则它不返回y的绝对值,而是返回布尔值,即<=运算符。

它返回一个布尔值。

Epsilon是双精度值,保持值为1E-14.

这是实际的IF语句

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

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

整个表情

Math.abs(y) <= EPSILON

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

x != 0

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

浮点数学运算本质上是不准确的,因此与其测试等效性(这总是一个坏主意),不如说开发人员选择了一个较小的数字(在这种情况下为1x10 ^ -14)作为接近零的可接受公差。 。 return语句返回一个比较,因此该操作将采用y的绝对值,并且当且仅当它足够接近于零(由EPSILON定义充分接近)时,才返回true。

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

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

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

"问题"是该片段在很大程度上依赖于运算符的优先级(本身还不错,但有时会造成混淆)。

在这里,我们可以找到所有具有优先级的Java运算符的列表,并在此处进行比较以比较C / C ++的同一表

相当于这个

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

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

一个替代方案是

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