Twierdzę że taka operacja będzie podawać poprawny wynik.
float x = 0.1, y = 0.2, z = 0.3, s = x+y;
if( s == z ) print 'równe'; // to wyjdzie!
else print 'różne'.
Zamiast pisać co powinno wyjść, to sprawdź... :)
Wystarczy sprawdzić różnicę:
0.1+0.2 - 0.3 = ?
Gdyby tu 0.1+0.2 było różne od 0.3, wówczas wynik powinien być niezerowy, coś w stylu 2.5334343e-16, w przypadku obliczeń na double.
Nawet te spartaczone kalkulatory z Windows produkują tu 0.
Kalkulatory produkują zero, bo zaokrąglają do iluś miejsc po przecinku.
Weź napisz w czymkolwiek (C++, Java, Python itd.) programy, które robią zaproponowane przez Ciebie testy, zobaczysz co wychodzi...
Twój przykłąd z float
daje akurat równość, natomiast z double
:
#include <iostream>
int main() {
using namespace std;
cout.setf(ios::scientific);
cout.precision(30);
double x = 0.1, y = 0.2, z = 0.3, s = x+y, r = s-z;
if(s == z) {
cout << "równe\n";
} else {
cout << "różne\n";
}
cout << x << endl;
cout << y << endl;
cout << z << endl;
cout << s << endl;
cout << r << endl;
}
daje:
różne
1.000000000000000055511151231258e-01
2.000000000000000111022302462516e-01
2.999999999999999888977697537484e-01
3.000000000000000444089209850063e-01
5.551115123125782702118158340454e-17
Nie jest natomiast problemem znaleźć liczby, dla których równości już nie ma dla float
, bo dla:
#include <iostream>
int main() {
using namespace std;
cout.setf(ios::scientific);
cout.precision(30);
float x = 0.0001, y = 0.0002, z = 0.0003, s = x+y, r = s-z;
if(s == z) {
cout << "równe\n";
} else {
cout << "różne\n";
}
cout << x << endl;
cout << y << endl;
cout << z << endl;
cout << s << endl;
cout << r << endl;
}
dostajemy już:
różne
9.999999747378751635551452636719e-05
1.999999949475750327110290527344e-04
3.000000142492353916168212890625e-04
2.999999851454049348831176757812e-04
-2.910383045673370361328125000000e-11
PS. Mam wrażenie, że wall to jakiś wytrawny troll (bo czemuż pisze bez rejestracji), albo też młody gniewny, który nie wie jak działają komputery i chciałby, żeby wszystko było idealne... :)