Witam, z czego wynikają rozbieżności wyników? Z jakich błędów?
b = 1.123456789*10^15
a) P = 1 -1/(1/b) + 0.1 (wynik to -1.123*10^15)
b) P = b + 0.1 - 1/(1/b) (wynik to 0.125 a nie 0.1)
Witam, z czego wynikają rozbieżności wyników? Z jakich błędów?
b = 1.123456789*10^15
a) P = 1 -1/(1/b) + 0.1 (wynik to -1.123*10^15)
b) P = b + 0.1 - 1/(1/b) (wynik to 0.125 a nie 0.1)
Nie przyglądałem się dokładnie działaniom, ale albo gdzieś następuje overflow albo jest zbyt mała precyzja liczb.
Wydaje mi się że w pierwszym przypadku może to być błąd obcięcia, komputer zostawia tylko 1.123*10^15. Z ręcznych obliczeń na to by wychodziło, ale nie jestem pewien.
@MateuszS - niestety, to nie to
int main() {
float b = 1.123456789E15;
printf("%f\n", b + 0.1 - 1/(1/b)); // (wynik to 0.125 a nie 0.1)?
}
T:\>gcc f.c
T:\>a
0.099915
Cóż, zdecydowanie nie jest to 0.125 jak mówisz że Ci wyszło - z tego pytanie, na czym te obliczenia wykonujesz? Liczby zmiennoprzecinkowe? W takim razie jaki standard?...
A co do pytanie z czego wynikają błędy - polecam lekturę http://en.wikipedia.org/wiki/IEEE_floating_point
W 32 bitach (ani w żadnej ich ilości) nie można upchnąć wszystkich możliwych liczb rzeczywistych - dlatego wszystkie obliczenia siłą rzeczy podlegają błędom zaokrąglenia. Błędy te są szczególnie dotkliwe kiedy obliczenia są wykonywane na bardzo dużych albo bardzo małych liczbach (a jeszcze bardziej kiedy używasz w działaniach /jednocześnie/ bardzo dużych i bardzo małych liczb) - jak w Twoim przykładzie.