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?
Respuestas:
Epsilon en matemáticas e ingeniería
En matemáticas e ingeniería en general:
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.0f
y el flotador más pequeño que es estrictamente mayor que1.0f
. Ese último número es1.00000011920928955078125f
para flotantes en Java y se puede calcular con: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:
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
small
yf
, pero su diferencia todavía está muy por debajo del épsilon de la máquina: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.
fuente
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.
fuente
Para responder directamente a su pregunta, desea utilizar el término
epsilon
. Más exactamente, esmachine epsilon
pero el uso común cae "máquina" y solo usaepsilon
.Mirando en mi copia local de
float.h
veo: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
epsilon
es 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í:
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.
fuente
simplest formula
para 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.Esta es una función de error; El error absoluto generalmente se llama ε (epsilon) o Δ x para alguna cantidad x:
El error relativo a veces se llama η (eta):
Para fines de programación,
absoluteError
yrelativeError
(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:
Error absoluto en Wolfram MathWorld
Error de aproximación en Wikipedia
fuente
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?
fuente