Al comparar flotadores, ¿cómo se llama el umbral de diferencia?


10

Estoy comparando flotantes en Java en este momento y la fórmula más simple es:

Math.abs(a - b) < THRESHOLD

Al nombrar su variable para el umbral de diferencia, ¿debería nombrarla delta o epsilon ? Específicamente, ¿cuál de los dos es el término correcto para el valor más pequeño que puede representar un número de coma flotante?

¿Es el término lenguaje de programación específico, o es universal en todos los idiomas?


1
Términos alternativos: "precisión", "resolución". Me gustan estos precisamente;) porque no suenan demasiado técnicos.
stakx

1
Fuera de tema: la guía de punto flotante recomienda no utilizar este tipo de comparación de casi igualdad.
stakx

1
@stakx: los términos que sugiere son incorrectos y tienen significados diferentes de los que pregunta el OP. La pregunta es detallada, sí, pero se puede responder con base en referencias externas y tiene relevancia para la programación cuando se trata de valores de coma flotante. Es constructivo y sobre el tema.

1
@ GlenH7: Nunca dije que la pregunta no era buena o no respondía. De hecho, fui yo quien lo votó. Y como usted afirma que los términos (ciertamente menos precisos) que sugerí son incorrectos, me interesaría saber por qué es así.
stakx

@stakx: disculpas por implicar que votaste para cerrar. Estaba reaccionando más a los cuatro votos cerrados sobre la cuestión en este momento.

Respuestas:


18

Epsilon en matemáticas e ingeniería

En matemáticas e ingeniería en general:

  • Delta se usa generalmente para referirse a una diferencia, que puede ser de cualquier escala.
  • Epsilon se usa generalmente para referirse a una cantidad insignificante.

y épsilon parece más apropiado en su caso.


Epsilon en informática

En ciencia de la computación en particular, el término épsilon también se refiere a la máquina espilón que mide la diferencia entre 1.0fy el flotador más pequeño que es estrictamente mayor que 1.0f. Ese último número es 1.00000011920928955078125fpara flotantes en Java y se puede calcular con:

float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);

La definición de máquina épsilon es consistente con el uso general de épsilon descrito anteriormente.


Comparar flotadores

Sin embargo, tenga en cuenta que antes de comparar flotadores para "proximidad", debe tener una idea de su escala. Dos flotadores muy grandes y supuestamente muy diferentes pueden ser iguales:

9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!

E inversamente, puede haber muchos valores de flotación posibles (y varios órdenes de magnitud) entre dos flotadores pequeños que difieren según la máquina épsilon "solo". En el ejemplo a continuación, hay 10,000,000 valores flotantes disponibles entre smally f, pero su diferencia todavía está muy por debajo del épsilon de la máquina:

float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!

El artículo vinculado en la respuesta de GlenH7 investiga aún más la comparación de flotación y propone varias soluciones para superar estos problemas.


2
-1: en el software informático científico, Epsilon se refiere a la máquina épsilon o al épsilon relativo (ver el mismo artículo). Típicamente, esta no es la misma cantidad utilizada para aceptar la igualdad aproximada, porque los errores de redondeo son múltiplos de épsilones de máquina o épsilones relativos, y típicamente un orden de magnitudes mayor que eso.
rwong

1
@rwong Esa es una especialización del término épsilon , y hay muchas otras. En ingeniería en general, epsilon se refiere a una pequeña cantidad o un error y la máquina epsilon es compatible con esa idea.
Assylias

@assylias, usando un nombre que tiene una definición estándar, en un contexto donde la definición estándar tiene sentido, pero para algo que no corresponde a la definición estándar es un recibo por problemas.
Programador

@AProgrammer No estoy de acuerdo con que la definición general de epsilon no sea aplicable a la informática.
Assylias

1
@assylias: gracias por la aclaración. He eliminado mi -1.
rwong

16

En matemáticas, delta se usa para representar alguna diferencia de un valor, epsilon se usa para representar un valor de error arbitrario. En este caso, épsilon sería el nombre convencional.


8

Para responder directamente a su pregunta, desea utilizar el término epsilon. Más exactamente, es machine epsilonpero el uso común cae "máquina" y solo usa epsilon.

Mirando en mi copia local de float.hveo:

#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */  
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
#define LDBL_EPSILON    DBL_EPSILON             /* smallest such that 1.0+LDBL_EPSILON != 1.0 */

Y los comentarios asociados dejan en claro que épsilon es el término al que se refiere.

Pero también podemos confiar en otras referencias externas para verificar que epsilones el término correcto. Vea aquí , aquí , aquí y finalmente esta combinación de etiquetas de consulta SO . No pude encontrar una referencia directa al estándar IEEE 754 para citar.


No preguntaste, pero encontré esta referencia que es muy relevante para el ejemplo que proporcionaste para aclarar tu pregunta.

Eche un vistazo a este artículo de blog de Bruce Dawson de Valve sobre la comparación de valores de coma flotante para obtener una idea de por qué no desea utilizar la comparación que sugirió.

Hay bastante información incluida en ese artículo, pero este es el fragmento más relevante a partir de ahí:

Si comparar flotantes para igualdad es una mala idea, entonces, ¿qué hay de verificar si su diferencia está dentro de algunos límites de error o valor de épsilon, como este:

bool isEqual = fabs(f1 – f2) <= epsilon;

Con este cálculo podemos expresar el concepto de dos flotadores que están lo suficientemente cerca que queremos considerarlos iguales. Pero, ¿qué valor debemos usar para epsilon?
Dada nuestra experimentación anterior, podríamos sentir la tentación de usar el error en nuestra suma, que fue aproximadamente 1.19e-7f. De hecho, incluso hay una definición en float.h con ese valor exacto, y se llama FLT_EPSILON.
Claramente eso es todo. ¡Los dioses del archivo de encabezado han hablado y FLT_EPSILON es el único épsilon verdadero!
Excepto que eso es basura. Para números entre 1.0 y 2.0, FLT_EPSILON representa la diferencia entre flotadores adyacentes. Para números menores que 1.0, un épsilon de FLT_EPSILON se vuelve demasiado grande rápidamente, y con números lo suficientemente pequeños, ¡FLT_EPSILON puede ser más grande que los números que está comparando!

Dawson repasa algunas otras consideraciones sobre las complejidades involucradas al comparar carrozas y tratar con valores muy pequeños como este, por lo que le recomendaría que lea el resto de su publicación.


Es posible que desee aclarar la primera parte de su respuesta: el artículo de Bruce ya explica por qué uno no debe usar un épsilon constante (como los definidos en un archivo de encabezado) para la comparación de tolerancias. Además, en muchos casos, un error de unos pocos millones de ULP no es algo de qué preocuparse, porque en la mayoría de las aplicaciones, nos preocupamos más por los dígitos significativos que por los errores en los dígitos menos significativos, porque la doble precisión ya da muchos más dígitos de los que nos importan.
rwong

@rwong: mientras lo leía, la pregunta era identificar el término correcto para el nombre de una constante. Por eso proporcioné la referencia float.h junto con algunas otras para maquinar epsilon. El artículo de Dawson es algo que encontré mientras buscaba la referencia IEEE 754 y pensé que era relevante para los OP simplest formulapara comparar. Muchos usan ese enfoque como un primer intento, e incluí el artículo de Dawson porque realmente entra en los matices de cuán difícil es la comparación. Así que intenté responder directamente a la pregunta y luego señalar por qué no usarla de esa manera.

5

Esta es una función de error; El error absoluto generalmente se llama ε (epsilon) o Δ x para alguna cantidad x:

ε = | esperado - real |

Δ x = | x 0 - x  |

El error relativo a veces se llama η (eta):

η = | 1 - real / esperado |

Para fines de programación, absoluteErrory relativeError(o algunas abreviaturas de los mismos) son más descriptivos. Si desea afirmar que el error es menor que un cierto valor, ese valor simplemente se llamará umbral o tolerancia .

Ver:


3

Yo lo llamaría "tolerancia".

Tal vez ese no sea el término matemáticamente correcto, pero el simple hecho de que haga la pregunta implica que ni "delta" ni "épsilon" serían un buen nombre variable para usar.

En mi experiencia, es mejor usar nombres de identificadores que tengan sentido para aquellos que realmente leerán el código. ¿De qué sirve un nombre perfectamente correcto si significa que el lector necesita buscarlo en Wikipedia para entender lo que significa?


+1. Siempre espero que la gente les pregunte a sus compañeros de trabajo sobre estas preguntas de nombres y que publiquen aquí.
MarkJ

66
-1, mejor aprender convenciones que evitarlas.
djechlin

+1 porque esta es exactamente la misma razón por la que publiqué esta pregunta.
NobleUplift
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.