Запутанная инструкция возврата - PullRequest
1 голос
/ 03 октября 2008

Я не могу точно понять, что делает оператор IF, из того, что я вижу, он проверяет, равна ли переменная x int 0. Если это true, то возвращается значение ABSOLUTE переменной y ... это когда я теряю график, почему тогда оператор return будет включать <= ESPILON? Конечно, это означает меньше или равно значению эпсилон? если так, как это работает? Если это не значит, тогда что это значит?

(код JAVA)

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

Ответы [ 8 ]

12 голосов
/ 03 октября 2008

Математика с плавающей точкой по своей природе является неточной, поэтому вместо проверки на эквивалентность (что всегда является плохой идеей) вместо этого разработчик выбрал небольшое число (1x10 ^ -14 в этом случае) в качестве приемлемого допуска для близость к нулю. Оператор return возвращает сравнение, поэтому он будет принимать абсолютное значение y и возвращать true тогда и только тогда, когда оно достаточно близко к нулю, где достаточно близко определено EPSILON.

5 голосов
/ 03 октября 2008

полное выражение

Math.abs(y) <= EPSILON

должен быть оценен первым, что означает, что функция вернет логическое значение (true / false). Сказав это, если

x != 0

тогда я не уверен, что будет возвращено.

5 голосов
/ 03 октября 2008

Возвращает true, если абсолютное значение y равно <= EPSILON, и false в противном случае. <= Вычисляется перед оператором возврата. Этот код эквивалентен: </p>

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 в исходном примере имеет очень низкий приоритет. Все операторы, такие как +, -, <,> =, оцениваются перед ним.

1 голос
/ 03 октября 2008

Возвращает логическое значение.

Эпсилон является двойным, имеет значение 1E-14.

Это фактическое утверждение IF

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

Итак, что возвращается, если абсолютное значение y меньше или равно Epsilon.

1 голос
/ 03 октября 2008

Вы правы, что он проверяет, равна ли переменная x (ну, может быть, int) 0. Однако, если это правда, то она не возвращает абсолютное значение y, она возвращает логическое значение, результат оператора <=. </p>

0 голосов
/ 03 октября 2008

Это эквивалентно

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

, который должен был быть добавлен в код для ясности. Как уже упоминалось, он возвращает логическое значение.

Альтернативой будет

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
0 голосов
/ 03 октября 2008

«Проблема» в том, что этот фрагмент сильно зависит от приоритета оператора (сам по себе неплохой, но иногда это может сбивать с толку).

Здесь вы можете найти список всех java-операторов с их приоритетом и здесь для сравнения той же таблицы для C / C ++

0 голосов
/ 03 октября 2008

Я давно не занимался Java, но может показаться, что это на самом деле возвращает логическое значение (которое может быть неявно приведено).

Я бы сказал, что если x равен 0, он возвращает true, когда абсолютное значение y <= Epsilon, в противном случае он возвращает false. </p>

Однако, если x не равен 0, тогда он вернет ноль, поскольку никакое утверждение не покрывает else.

...