Ho un algoritmo che utilizza floats
o doubles
per eseguire alcuni calcoli.float/doppia uguaglianza con lo zero esatto
Esempio:
double a;
double b;
double c;
...
double result = c/(b - a);
if ((result > 0) && (result < small_number))
{
// result is relevant...
} else {
// result not required...
}
Ora, io sono preoccupato per (b - a)
potrebbe essere pari a zero. Se è vicino a zero ma non a zero, non importa perché il result
sarà fuori portata per essere utile, e già noto che (dato che (b - a)
si avvicina a zero, result
si avvicina a +/- inf, che non è nel variare 0
-small_number
...)
Ma se il risultato di (b - a)
è esattamente pari a zero, mi aspetto che qualcosa dipendente dalla piattaforma accadrà a causa di dividere per zero. Ho potuto modificare l'istruzione if
a:
if ((!((b-a) == 0.0)) && ((result = c/(b-a)) > 0) && (result < small_number)) {
ma non so se (b-a) == 0.0
rileverà sempre uguaglianza con zero. Ho visto che ci sono più rappresentazioni per lo zero esatto in virgola mobile? Come puoi testarli tutti senza fare qualche controllo epsilon, cosa di cui non ho bisogno (un piccolo epsilon verrà ignorato nel mio algoritmo)?
Qual è il modo indipendente dalla piattaforma per controllare?
EDIT:
Non so se era abbastanza chiaro alla gente. Fondamentalmente voglio sapere come trovare se un'espressione come:
double result = numerator/denominator;
si tradurrà in un'un'eccezione a virgola mobile, un'eccezione cpu, un segnale dal sistema operativo o qualche altra cosa .... senza eseguire effettivamente il funzionamento e vedere se "getterà" ... perché rilevare un "lancio" di questa natura sembra essere complicato e specifico della piattaforma.
È sufficiente il numero ((denominator==0.0) || (denominator==-0.0)) ? "Will 'throw'" : "Won't 'throw'";
?
Anche se 'b - a' non è esattamente pari a zero, l'operazione' c/(b - a) 'potrebbe ancora troppo pieno e inviare il valore di' +/- INF'. – Mysticial
@Mystical Va bene, metterebbe il risultato al di fuori dell'intervallo di interesse per il mio problema. – Bingo
È difficile trovare un'implementazione che non utilizza la virgola mobile IEEE. Quindi penso che sia sicuro assumere che la divisione per '0 'darà semplicemente' + INF' o '-INF'? Qualcuno dovrebbe correggermi se sbaglio? – Mysticial