Hay dos conceptos involucrados aquí:
- Una unidad de precisión de la máquina:
Double.ulp()
- Una máquina de precisión para un determinado
double d
: Double.ulp(d)
Si llama a Double.ulp()
obtendrá la máquina de precisión unidad, que es la precisión que puede esperar de una plataforma de hardware determinada ... ¡sea cual sea esta definición!
Si llama al Double.ulp(d)
, obtendrá la precisión de la máquina para double d
. En otras palabras, cada double d
tiene su precisión específica. Esto es más útil que el párrafo anterior.
Debe prestar especial atención a los detalles cuando realiza iteraciones que implican cálculos en cascada, es decir, cuando los resultados de los cálculos anteriores se emplean en el cálculo actual. Esto se debe a que los errores se acumulan en estas situaciones y pueden terminar, en ciertas circunstancias, entregando resultados que están muy lejos del verdadero valor que deberían ofrecer. En determinadas circunstancias, el tamaño del error acumulado puede ser incluso mayor que el valor verdadero. Ver algunos disastrous examples here.
En ciertos dominios comerciales, los errores de cálculo numérico simplemente no son aceptables.Dependiendo del dominio del negocio, sus regulaciones, requisitos y características, debe tomar enfoques alternativos para la opción simplista de emplear la aritmética de coma flotante (es decir: doubles
o floats
).
En el caso de Finanzas, por ejemplo, nunca utilice la aritmética de coma flotante. Nunca utilice doubles
o floats
cuando se trata de dinero. Nunca. Período. Puede emplear BigDecimal o fixed point arithmetic, según las circunstancias.
En el caso específico del procesamiento de precios de acciones, usted sabe que los precios tienen siempre 5 dígitos de precisión y, en este caso, fixed point arithmetic es suficiente y también ofrece el rendimiento máximo que puede obtener, que es muy fuerte y requisito común en este dominio comercial.
Si el dominio del negocio realmente requiere cálculos numéricos, en este caso debe asegurarse de mantener la propagación de errores bajo su estricto y cuidadoso control. Este es un tema largo, hay una serie de técnicas, y muy frecuentemente los desarrolladores pasan por alto el problema simplemente creyendo que hay una sola llamada mágica a un método que hace todo el trabajo duro por ellos. No, no es así. Tienes que investigar, hacer tu tarea y hacer todo el trabajo necesario para asegurarte de mantener los errores bajo control. Necesita comprender exactamente qué está pasando con los algoritmos numéricos que ha implementado.
@ Chek, su pregunta no está clara, ¿qué espera de epsilon? – mhshams