2010-09-16 6 views
9

Obtengo este fragmento de código de algún otro lugar. Según el webmaster, el código se escoge de The art of computer programming by KnuthDiferencia entre aproximadamente igual y esencialmente igual en El arte de la programación de computadoras

Como no tengo una copia de ese libro, ¿puedo saber cuál es la diferencia entre las dos funciones?

bool approximatelyEqual(float a, float b, float epsilon) 
{ 
    return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon); 
} 

bool essentiallyEqual(float a, float b, float epsilon) 
{ 
    return fabs(a - b) <= ((fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon); 
} 

Respuesta

11

Para dar un ejemplo:

double a = 95.1, b = 100.0; 
assert(approximatelyEqual(a, b, 0.05)); 
assert(!essentiallyEqual(a, b, 0.05)); 

es decir, con epsilon ser un 5%, 95.1 es aproximadamente 100, a medida que cae dentro del margen de 5% del valor de 100 (más grande). Por otro lado, 95.1 no es esencialmente 100, ya que 100 no está dentro de una diferencia del 5% de 95.1 (valor más pequeño).

+0

¿Puedo decir que esencialmenteEqual siempre necesitará un valor "más cercano" que aproximadamente igual? –

+0

Sí, los valores de 'esencialmente Equal' siempre estarán más cerca que los valores de 'approximatelyEqual'. – palswim

+3

Piense en las ofertas en su tienda habitual y qué porcentajes significan allí. ¿Qué es más valioso 33% de descuento en el precio o 33% de producto adicional gratis? La solución es que debe preferir el 33% de descuento, ya que es equivalente a una oferta de producto adicional del 50%. Lo mismo ocurre aquí, dependiendo de si toma el épsilon alrededor del mayor o menor de los dos valores, el resultado será diferente. 66.6 es aproximadamente igual a 100 con un épsilon de 33%, pero solo es esencialmente igual a un épsilon de 50%. –

9

approximatelyEqual da si la diferencia entre a y b es menor que el error aceptable (epsilon), determinado por el mayor de a o b. Esto significa que los dos valores están "lo suficientemente cerca", y podemos decir que son aproximadamente iguales.

essentiallyEqual da si la diferencia entre a y b es menor que el error aceptable (epsilon), determinado por el más pequeño de a o b. Esto significa que los valores difieren menos que la diferencia aceptable en cualquier cálculo, por lo que tal vez no sean realmente iguales, pero son "esencialmente iguales" (dado el epsilon).

Esto tiene aplicaciones en problemas donde tenemos datos y tasas de "error aceptable" y tal. Este código solo te da una definición algorítmica de esos términos.

+0

¿Puedes dar un ejemplo del mundo real, cómo debemos elegir entre las 2 funciones? –

+0

'Esto significa que los valores difieren menos que la diferencia aceptable en cualquier cálculo' - si los valores difieren es menor, ¿esto también significa' lo suficientemente cerca '? Entonces, ¿qué será diferente de 'approximatelyEqual' aproximado? –

+0

Aquí hay un [artículo médico] (http://www.pnas.org/content/95/3/811.full) que usa ambos términos. No es necesariamente cómo elegir, pero también es la forma de describir los datos. – palswim

3

La diferencia es que la igualdad esencial implica una igualdad aproximada, pero no al revés. Entonces la igualdad esencial es más fuerte que la igualdad aproximada.

También igualdad esencial no es transitivo, pero si a es esencialmente igual a b, y b es esencialmente igual a c, entonces a es aproximadamente igual a c (por otro valor de epsilon).

+0

+1 para análisis transitivo –

Cuestiones relacionadas