Błędy numeryczne

0

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)
0

Nie przyglądałem się dokładnie działaniom, ale albo gdzieś następuje overflow albo jest zbyt mała precyzja liczb.

0

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.

0

@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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1