Aproximación de números reales

Y ahora empezamos la algoritmia con métodos y funciones. ¡Ánimo!

Un sencillo algoritmo para comenzar:

La representación de los números reales, sobre todo si son irracionales, puede resultar algo imprecisa; por lo que la igualdad de dos reales puede posiblemente estar sujeta a algún error. Por eso, el operador == puede no resultar satisfactorio. Por lo tanto, debemos escribir una función que considere iguales dos números reales suficientemente próximos.

Solución

Una primera idea consiste en cambiar la comparación x == y por:

|x -y|<ξ

siendo ξ el margen de tolerancia entre dos reales supuestamente iguales ( las plecas indican valor absoluto):

boolean proximidad(double x, double y) {
float margen_error = (float) 1E-6;
boolean result = Math.abs(x – y) < margen_error;

return result;
}

Pero esta solución presenta el inconveniente de conceder el mismo margen de tolerancia o error a cualquier par de reales, independientemente de su orden de magnitud. Por ejemplo, un margen ξ = 10-3 resulta excesivo para comparar cifras de órdenes pequeños (tales como medidas de átomos o electrones, por ejemplo), y a la vez ese mismo margen es muy estrecho para números de órdenes grandes (por ejemplos, las distancias astronómicas entre planetas al Sol).

Una solución consiste en sustituir la expresión |x -y|<ξ  por:

|x – y|/(x²+y²) < ξ

que relativiza la distancia según el orden de magnitud.

Ahora surge la posible división por cero, que se presenta en el caso de ser x e y nulos o de valor muy, muy pequeño. Por ello, se opta por:

|x – y|<ξ*(x²+y²)

Por lo que basta usar la función anterior, cambiando las últimas líneas por éstas:

boolean result = Math.abs(x – y) < margen_error*(x*x+y*y);
return result;

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s