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;
¿Fue útil?

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.

El " número " es que este fragmento depende en gran medida de la precedencia del operador (no está mal per se, pero a veces puede ser confuso).

Aquí puede encontrar una lista de todos los operadores de Java con su precedencia, y aquí para comparar la misma tabla para C / C ++

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top