Numerele reale sunt numere care nu pot fi reprezentate exact in calculator. Gandeste-te la 1/3 sau radical din 2. Acestea au o infinitate de zecimale. Si de aceea daca ai o variabila de tip double, ea va fi tot timpul o aproximare a numarului pe care il doresti. Totusi, de obicei, aproximarea e destul de buna. Eventual poti sa incerci long double daca double nu e de ajuns. O alta idee ar fi sa incerci sa eviti sa faci multe operatii pe un numar real, deoarece eroarea se acumuleaza. De exemplu daca ai x * (y + z) - y * (x + z) e bine sa simplifici la z * (x - y).
Daca vrei sa compari doua numere reale, ele pot fi putin diferite chiar daca reprezinta acelasi numar. De aceea, nu se foloseste direct operatorul ==, ci se verifica daca diferenta e suficient de mica incat sa consideram numerele egale. Exemplu:
const double eps = 1e-6;
double a = 2.1 * (2.3 + 2.4) - 2.3 * (2.1 + 2.4);
double b = 2.4 * (2.1 - 2.3);
if (a == b) {
cout << "== egale" << endl;
}
else {
cout << "== diferite" << endl;
}
if (abs (a - b) < eps) {
cout << "eps egale" << endl;
}
else {
cout << "eps diferite" << endl;
}
Totul depinde de precizia de care ai nevoie la problema (de acolo il ei pe eps). Daca ai nevoie de precizie foarte mare s-ar putea sa nu poti face ce vrei, dar la 4 zecimale dupa virgula, de obicei ajunge double. Ideea e ca daca diferenta dintre doua numere e mai mica decat 0.00001, atunci cele doua numere au primele 4 cifre de dupa virgula identice.
Multa lume s-a pacalit cu numerele reale. Uite cateva exemple din viata reala:
http://ta.twi.tudelft.nl/users/vuik/wi211/disasters.html