令人困惑的退货声明
我无法确切了解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;