Я не могу точно понять, что делает оператор IF, из того, что я вижу, он проверяет, равна ли переменная x int 0. Если это true, возвращается АБСОЛЮТНОЕ значение переменной y ... это когда я теряю график, почему тогда оператор return будет включать <= ESPILON? Несомненно, это означает, что значение epsilon меньше или равно значению? если да, то как это работает? Если это не так, то что это значит?
(КОД JAVA)
final double EPSILON = 1E-14;
if (x == 0)
return Math.abs(y) <= EPSILON;
разве не в этом дело? Это было сделано из-за неточности избегать FP - тег кажется вполне уместным.




Он возвращает истину, если абсолютное значение 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.
Я давно не занимался Java, но похоже, что это действительно возвращает логическое значение (которое может быть неявно приведено).
Я бы сказал, что если x равно 0, он возвращает true, когда абсолютное значение y <= Epsilon, в противном случае возвращает false.
Однако, если x не равно 0, он вернет null, поскольку ни один оператор не покрывает else.
«Проблема» в том, что этот фрагмент сильно зависит от приоритета операторов (сам по себе неплохо, но иногда может сбивать с толку).
Здесь вы можете найти список всех java-операторов с их приоритетом и здесь для сравнения той же таблицы для C / C++
Приоритет здесь действительно прост. Вызов методов всегда имеет очень высокий приоритет. После этого остается только один оператор. return не является оператором - это оператор типа if или while, который принимает выражение.
Это эквивалентно этому
return (Math.abs(y) <= EPSILON);
которые следовало добавить в код для ясности. Как уже упоминалось, он возвращает логическое значение.
Альтернативами были бы
if (Math.abs(y) <= EPSILON)
return true;
else
return false;
Винсент, я не понимаю цели повторной пометки этого тега как неточности с плавающей запятой, если вы не собираетесь ничего говорить о том, почему это связано с этим. В любом случае неточность FP является в первую очередь проблемой для сравнения на равенство, а не для <=. С пометкой.