Cześć,
Napisałem funkcję, która w założeniu miała liczyć ilość miejsc po przecinku w zmiennej double:
int decimalPointsCount(double number)
{
number -= long(number);
int res = 0;
while((number - (long long)number) != 0)
{
cout << number << " - " << (long)number << " = " << (number-(long)number) << endl;
++res;
number *= 10;
}
return res;
}
Po wywołaniu funkcji:
cout << decimalPointsCount(0.53);
dostaję taki output:
0.53 - 0 = 0.53
5.3 - 5 = 0.3
53 - 53 = 7.10543e-015
530 - 530 = 1.13687e-013
5300 - 5300 = 9.09495e-013
53000 - 53000 = 7.27596e-012
530000 - 530000 = 1.16415e-010
5.3e+006 - 5300000 = 9.31323e-010
5.3e+007 - 53000000 = 7.45058e-009
5.3e+008 - 530000000 = 5.96046e-008
5.3e+009 - -2147483648 = 7.44748e+009
5.3e+010 - -2147483648 = 5.51475e+010
5.3e+011 - -2147483648 = 5.32147e+011
5.3e+012 - -2147483648 = 5.30215e+012
5.3e+013 - -2147483648 = 5.30021e+013
5.3e+014 - -2147483648 = 5.30002e+014
Dlaczego po trzeciej iteracji pętla się nie zakończyła, skoro odejmowane od siebie liczby były sobie równe? Czemu wynik odejmowania to 7.10543e-015? Po tym, co znalazłem w internecie wnioskuję, że w momencie mnożenia number
przez 10 zachodzi strata danych, ale nie potrafię tego problemu rozwiązać.