Per rendere breve il problema, diciamo che voglio calcolare l'espressione a/(b - c)
su float
s."epsilon" garantisce davvero qualsiasi cosa nei calcoli in virgola mobile?
per assicurarsi che il risultato è significativo, posso verificare se b
e c
sono in egual:
float EPS = std::numeric_limits<float>::epsilon();
if ((b - c) > EPS || (c - b) > EPS)
{
return a/(b - c);
}
ma i miei test mostrano che non è sufficiente a garantire sia risultati significativi né non mancando di fornire un risultato se è possibile.
Caso 1:
a = 1.0f;
b = 0.00000003f;
c = 0.00000002f;
Risultato: La condizione if non è soddisfatto, ma l'espressione produrrebbe un risultato corretto 100.000.008 (come per la precisione dei galleggianti).
Caso 2:
a = 1e33f;
b = 0.000003;
c = 0.000002;
Risultato: La condizione if è soddisfatta, ma l'espressione non produce un risultato significativo +1.#INF00
.
ho trovato sia molto più affidabile per controllare il risultato, non gli argomenti:
const float INF = numeric_limits<float>::infinity();
float x = a/(b - c);
if (-INF < x && x < INF)
{
return x;
}
ma per fare cosa è l'Epsilon allora e perché tutti dicendo Epsilon è buono da usare?
"non ti dice quale valore di epsilon è giusto per quello che stai facendo": per favore sottolinea questa frase di più, è davvero importante. –