Blog (55)
Komentarze (990)
Recenzje (1)

Czy komputer potrafi liczyć?

@kubutCzy komputer potrafi liczyć?27.11.2013 04:07

Co będzie, gdy powiem Wam, że komputer nie zawsze zwraca poprawny wynik działań arytmetycznych? I wcale nie chodzi tutaj o skomplikowane obliczenia! Okazuje się, że nasz blaszany przyjaciel ma problemy nawet z trywialnymi operacjami arytmetycznymi. Wszak każdy potrafi powiedzieć ile wynosi wynik takiego działania jak 1000.1 - 1000. Niewiele zmieni, jeśli zamiast 1000, sto razy odejmę 10 (bo 10*100 = 1000). Tylko czy oby na pewno? Sprawdźmy to na prościutkim programie:

[code=c++] float x = 1000.1; int i; for(i=0;i<100;i++){ x = x-10; } std::cout<

Kompilujemy i... wynik jest niepoprawny

Sprawdzamy kod jeszcze raz - wszystko wydaje się ok.

Więc w czym problem?

Problemem okazuje się być sposób, w jaki zapisywane są liczby w naszych komputerach. To, oraz komplikacje które z tego wynikają. Nie mam zamiaru tutaj tego opisywać, bo nie widzę sensu w przepisywaniu wikipedii, gdzie jest to dość ładnie opisane. Zresztą większość osób czytających ten wpis zapewne ma o tym pojęcie, możliwe jednak że nie zdają sobie sprawy z tego, jak bardzo może to zakłamywać wyniki prostych operacji, jak ta wyżej. Przypomnę tylko w skrócie, że na skończonej liczbie bitów nie da się zapisać każdej liczby (tak jak na skończonej liczbie cyfr dziesiętnych nie da się zapisać każdej liczby, przykładowo 1/3). W systemie binarnym mamy problem nawet z taką liczbą jak 1/10 ! Przez to podczas wykonywania obliczeń otrzymujemy wyniki z błędem, zwłaszcza przy odejmowaniu bliskich sobie liczb (jeśli znajdzie się grono odbiorców mogę pokusić się o opisanie tego dokładniej - dzisiaj pokażę jedynie kilka ciekawych błędów). Przeważnie błędy te są na tyle małe, że ich nie zauważamy, ale jak widać przy stukrotnym powieleniu operacji błędy się kumulują dając już zauważalne odchylenie. Okazuje się, że może być o wiele gorzej. Albo dziwniej...

[code=c++] float x = 1.0; while(1!=x+1){ x = x/2; } if(x!=0){ std::cout<<"Komputer twierdzi ze x jest rozne od 0"<

Kolejność dodawania?

Było wielokrotne odejmowanie, pobawmy się zatem dodawaniem :) Pytanie brzmi: czy oby na pewno kolejność dodawania nie ma znaczenia? Zobaczmy to na przykładzie:

[code=C++]float s1, s2; int i, j; s1 = 0.0; s2 = 0.0; for(i=1; i<=100000; i++){ s1 = s1 + 1.0/(float)(i*(i+1)); } for(j=100000; j>=1; j--){ s2 = s2 + 1.0/(float)(j*(j+1)); } std::cout<

Niby nic złego się nie powinno stać, ale zerknijmy na wyniki:

I co w związku z tym?! Przecież to malutkie błędy!

Błędy są malutkie, bo przykłady nie należą do zbyt wyrafinowanych. Nie oznacza to, że błędy numerycznie nie mogą być katastroficzne w skutkach. Przykładem może być tutaj eksplozja rakiety wartej 500 milionów dolarów Ariane 5. Przyczyna? Błąd konwersji liczby zmiennoprzecinkowej (64 bity) na całkowitą (16 bitów) i rzucenie wyjątku przez system. Głupia rzecz? Jak widać nie. Drugim przykładem może być system PATRIOT który w 1991 roku zawiódł, co kosztowało życie 28 amerykańskich żołnierzy. Gdy zegar baterii (trzymany jako liczba całkowita) osiągał duże wielkości, przy konwersji na liczbę zmiennoprzecinkową powodowało spory błąd. Pewnego dnia system działał od 100 godzin pociągając za sobą błąd 1/3 sekundy. To natomiast przełożyło się na uderzenie 700 metrów od pierwotnego celu! Można było tego uniknąć, bo aby system działał poprawnie wystarczyło restartować go co kilka godzin. Co ciekawe, Amerykanie wiedzieli o luce, a aktualizacja była w drodze - niczym w (amerykańskim) dramacie hollywoodzkim dotarła dzień za późno.

Wpis zainspirowany oraz oparty jest w dużej mierze na wykładzie dr Pawła Woźnego, dotyczącego analizy numerycznej.

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.