Запутанное заявление о возврате

Я не могу точно понять, что делает оператор IF, из того, что я вижу, он проверяет, равна ли переменная x int 0. Если это true, возвращается АБСОЛЮТНОЕ значение переменной y ... это когда я теряю график, почему тогда оператор return будет включать <= ESPILON? Несомненно, это означает, что значение epsilon меньше или равно значению? если да, то как это работает? Если это не так, то что это значит?

(КОД JAVA)

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

Винсент, я не понимаю цели повторной пометки этого тега как неточности с плавающей запятой, если вы не собираетесь ничего говорить о том, почему это связано с этим. В любом случае неточность FP является в первую очередь проблемой для сравнения на равенство, а не для <=. С пометкой.

Airsource Ltd 03.10.2008 04:35

разве не в этом дело? Это было сделано из-за неточности избегать FP - тег кажется вполне уместным.

nickf 03.10.2008 04:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
716
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Он возвращает истину, если абсолютное значение y <= EPSILON, и ложь в противном случае. <= Оценивается перед оператором возврата. Этот код эквивалентен:

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. Однако, если это правда, тогда он не возвращает абсолютное значение y, а возвращает логическое значение, результат <= оператор.

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

Эпсилон - это двойник, имеющий значение 1E-14.

Это фактический оператор IF

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

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

Все выражение

Math.abs(y) <= EPSILON

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

x != 0

то я не уверен, что вернут.

Ответ принят как подходящий

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

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

Dave L. 03.10.2008 05:21

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

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

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

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

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

Приоритет здесь действительно прост. Вызов методов всегда имеет очень высокий приоритет. После этого остается только один оператор. return не является оператором - это оператор типа if или while, который принимает выражение.

Darron 03.10.2008 16:57

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

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

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

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

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

Другие вопросы по теме