Tengo un algoritmo que usa floats
o doubles
para realizar algunos cálculos.igualdad flotante/doble con cero exacto
Ejemplo:
double a;
double b;
double c;
...
double result = c/(b - a);
if ((result > 0) && (result < small_number))
{
// result is relevant...
} else {
// result not required...
}
Ahora, yo estoy preocupado por (b - a)
podría ser cero. Si está cerca de cero pero no es cero, no importa porque el result
estará fuera de rango para ser útil, y ya detecto que (como (b - a)
se aproxima a cero, result
se acercará a +/- inf, que no está en el rango 0
- small_number
...)
Pero si el resultado de (b - a)
es exactamente cero, espero que algo dependiente de la plataforma ocurra debido a la división por cero. Podría cambiar la declaración if
a:
if ((!((b-a) == 0.0)) && ((result = c/(b-a)) > 0) && (result < small_number)) {
pero yo no sé si (b-a) == 0.0
detectará siempre igual a cero. He visto que hay múltiples representaciones para el cero exacto en coma flotante. ¿Cómo puedes probarlos a todos sin hacer un chequeo épsilon, que no necesito (un pequeño epsilon será ignorado en mi algoritmo)?
¿Cuál es la plataforma de manera independiente para comprobar?
EDIT:
No estoy seguro de si era lo suficientemente claro para la gente. Básicamente quiero saber cómo encontrar si una expresión como:
double result = numerator/denominator;
dará lugar a una excepción de coma flotante, una excepción de la CPU, una señal del sistema operativo o alguna otra cosa .... sin realizar la operación y ver si se "lanzará" ... porque detectar un "tiro" de esta naturaleza parece ser complicado y específico de la plataforma.
¿Es suficiente ((denominator==0.0) || (denominator==-0.0)) ? "Will 'throw'" : "Won't 'throw'";
?
Incluso si 'b - a' no es exactamente igual a cero, la operación' c/(b - a) 'podría todavía desbordamiento y enviar el valor de' +/- INF'. – Mysticial
@Mystical Eso está bien, pondría el resultado fuera del rango de interés para mi problema. – Bingo
Es difícil encontrar una implementación que no utilice IEEE punto flotante. Entonces, creo que es seguro suponer que la división por '0' solo arrojará' + INF' o '-INF'? ¿Alguien me quiere corregir si estoy equivocado? – Mysticial