Вопрос

Я не могу точно понять, что делает оператор 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.

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

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

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

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

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

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

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top