Запутанная инструкция возврата
-
03-07-2019 - |
Вопрос
Я не могу точно понять, что делает оператор IF, из того, что я вижу, проверяется, равна ли переменная x
переменной int 0
. Если это true
, то возвращается значение ABSOLUTE для переменной y
... это когда я теряю график, почему тогда оператор return будет включать <= ESPILON
? Конечно, это означает меньше или равно значению эпсилон? если так, как это работает? Если это не значит, то что это значит?
(JAVA CODE)
final double EPSILON = 1E-14;
if (x == 0)
return Math.abs(y) <= EPSILON;
Решение
Математика с плавающей точкой по своей природе является неточной, поэтому вместо проверки на эквивалентность (что всегда является плохой идеей) вместо этого разработчик выбрал небольшое число (1x10 ^ -14 в этом случае) в качестве приемлемого допуска для близость к нулю. Оператор return возвращает сравнение, поэтому он будет принимать абсолютное значение y и возвращать true тогда и только тогда, когда оно достаточно близко к нулю, где достаточно близко определено EPSILON.
Другие советы
Возвращает true, если абсолютное значение y равно < = EPSILON, и false в противном случае. & Lt; = вычисляется перед оператором 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 в исходном примере имеет очень низкий приоритет. Все операторы, такие как +, -, & Lt ;, & Gt; = оцениваются перед ним.
Полное выражение
Math.abs(y) <= EPSILON
Сначала следует оценить , что означает, что функция будет возвращать логическое значение (true / false). Сказав это, если
x != 0
тогда я не уверен, что будет возвращено.
Вы правы, что он проверяет, равна ли переменная x (ну, может быть, int) 0. Однако, если это правда, то она не возвращает абсолютное значение y, она возвращает логическое значение, результат оператора < =.
Он возвращает логическое значение.
Эпсилон является двойным, имеет значение 1E-14.
Это фактическое утверждение IF
if (x==0) {
return MATH.abs(y) <= EPSILON;
}
Итак, что возвращается, если абсолютное значение y меньше или равно Epsilon.
Я давно не занимался Java, но может показаться, что это на самом деле возвращает логическое значение (которое может быть неявно приведено).
Я бы сказал, что если x равен 0, он возвращает истину, когда абсолютное значение y < = Epsilon, в противном случае он возвращает ложь.
Однако, если x не равен 0, он вернул бы ноль, поскольку никакое утверждение не покрывает else.
Это эквивалентно этому
return (Math.abs(y) <= EPSILON);
который должен был быть добавлен в код для ясности. Как уже упоминалось, он возвращает логическое значение.
Альтернативы будут
if (Math.abs(y) <= EPSILON)
return true;
else
return false;