Declaración de devolución confusa
-
03-07-2019 - |
Pregunta
No entiendo exactamente qué está haciendo la instrucción IF, por lo que puedo ver, está comprobando si la variable x
es igual a int 0
. Si este es true
se devuelve el valor ABSOLUTO de la variable y
... esto es cuando pierdo el gráfico, ¿por qué la declaración de retorno luego incluiría <= ESPILON
? ¿Seguramente esto significa menos o igual que el valor de épsilon? si es así, ¿cómo funciona eso? Si no significa eso, ¿qué significa?
(CÓDIGO JAVA)
final double EPSILON = 1E-14;
if (x == 0)
return Math.abs(y) <= EPSILON;
Solución
Las matemáticas de punto flotante son, por su propia naturaleza, inexactas, por lo que, en lugar de probar la equivalencia (que siempre es una mala idea), el desarrollador ha elegido un pequeño número (1x10 ^ -14 en este caso) como la tolerancia aceptable para Proximidad a cero. La declaración return devuelve una comparación, por lo que lo que hará es tomar el valor absoluto de y, y devolver verdadero si y solo si está suficientemente cerca de cero, donde EPSILON define suficientemente cerca.
Otros consejos
Devuelve verdadero si el valor absoluto de y es < = EPSILON, y falso en caso contrario. & Lt; = se evalúa antes de la declaración de devolución. Este código es equivalente:
if(x == 0)
{
boolean ret = Math.abs(y) <= EPSILON;
return ret;
}
El código no se lee simplemente de izquierda a derecha. Un ejemplo más simple es
int x = 3 + 4 * 5;
Después de evaluar esto, x es 23, no 35. La evaluación es 3 + (4 * 5), no (3 + 4) * 5, porque el * tiene mayor prioridad que el +. La declaración de devolución en el ejemplo original tiene una precedencia muy baja. Todos los operadores como +, -, & Lt ;, & Gt; = se evalúan antes que él.
La expresión completa
Math.abs(y) <= EPSILON
debe evaluarse primero, lo que significa que la función devolverá un valor booleano (verdadero / falso). Dicho esto, si
x != 0
entonces no estoy seguro de lo que se devolverá.
Tienes razón en que está comprobando si la variable x es igual a (bueno, tal vez int) 0. Sin embargo, si esto es cierto, entonces no devuelve el valor absoluto de y, devuelve un valor booleano, el resultado del operador < =.
Devuelve un valor booleano.
Epsilon es un doble, con el valor 1E-14.
Esta es la declaración IF real
if (x==0) {
return MATH.abs(y) <= EPSILON;
}
Entonces, lo que se devuelve es si el valor absoluto de y es menor o igual que Epsilon.
No he hecho Java en mucho tiempo, pero parece que esto en realidad está devolviendo un valor booleano (que podría emitirse implícitamente).
Diría que si x es igual a 0, devuelve verdadero cuando el valor absoluto de y < = Epsilon, de lo contrario, devuelve falso.
Sin embargo, si x no es igual a 0, devolvería nulo, ya que ninguna instrucción cubre el resto.
Es equivalente a esto
return (Math.abs(y) <= EPSILON);
que debería haberse agregado al código para mayor claridad. Como se ha mencionado, devuelve un valor booleano.
Una alternativa sería
if (Math.abs(y) <= EPSILON)
return true;
else
return false;