Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wybrane aspekty programowania w C++ (i nie tylko) Konsekwencje zastosowania systemu binarnego do zapisu wartości liczb Czyli: dlaczego wyniki są złe, mimo.

Podobne prezentacje


Prezentacja na temat: "Wybrane aspekty programowania w C++ (i nie tylko) Konsekwencje zastosowania systemu binarnego do zapisu wartości liczb Czyli: dlaczego wyniki są złe, mimo."— Zapis prezentacji:

1 Wybrane aspekty programowania w C++ (i nie tylko) Konsekwencje zastosowania systemu binarnego do zapisu wartości liczb Czyli: dlaczego wyniki są złe, mimo że program jest napisany „dobrze”?

2 Wybrane aspekty programowania w C++ (i nie tylko) Typy całkowite Zapis zmiennoprzecinkowy Typy rzeczywiste Tablice

3 Wybrane aspekty programowania w C++ (i nie tylko) Typy całkowite: int „Najbardziej oczywisty” typ całkowity 4 bajty: 32 bity, 2 32 = 4294967296 możliwości Zakres wartości: od -2147483648 do 2147483647 Przy przekroczeniu górnego zakresu, program zaczyna liczyć od dolnego zakresu (zamiast 2147483648 będzie -2147483648) Przy przekroczeniu dolnego zakresu, program zaczyna liczyć od górnego zakresu (zamiast -2147483650 będzie 2147483646)

4 Wybrane aspekty programowania w C++ (i nie tylko) Typy całkowite: int, long long int – różne standardy instrukcja„stary” standard„nowy” standard int Azja=4190000000; Uwaga, przypisanie błędnej wartości int Azja=5190000000;Błąd Uwaga, przypisanie błędnej wartości long long int Azja=4190000000; prawidłowa wartość (jak unsigned) prawidłowa wartość long long int Azja=5190000000; Błąd (trzeba dopisać ll)prawidłowa wartość

5 Wybrane aspekty programowania w C++ (i nie tylko) Typy całkowite: unsigned int, long long int Program „ludność świata” Unsigned int - zakres wartości: od 0 do 4294967295 long long (int) – 8 bajtów, 2 64 możliwości, liczby ujemne i dodatnie rzędu tryliona (od ok. -10 18 do 10 18 ) Przy deklarowaniu liczby o dużym module – dopisać LL (konieczne w starszym standardzie), w wyrażeniach: (long long)x, (long long)1000000 Można stosować unsigned long long

6 Wybrane aspekty programowania w C++ (i nie tylko) Typy całkowite: UWAGA NA ZASADĘ: Typ wyniku taki jak typ argumentów w wyrażeniu Zaokrąglenia przy dzieleniu liczb całkowitych 8 / 3 = 2 (??) Obliczając liczbę rzeczywistą: np. 8. / 3 lub (float)8 / 3 Mamy int x=1000000, y=1000000 oraz long long z z=x*y – nie otrzymamy 1000000000000 ! (co najmniej jedna ze zmiennych x i y musi być long long)

7 Wybrane aspekty programowania w C++ (i nie tylko) Typy rzeczywiste Liczba – konkretna ilość bitów Pewnych wartości nie można zapisać dokładnie używając skończonej ilości bitów (lub cyfr, np. 1/3 = 0.33333…), możliwa utrata części informacji Narastanie błędów w trakcie obliczeń Kolejność w dodawaniu – czy ma znaczenie? Warunki, pętle

8 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: system dziesiętny ± 1.23456 * 10 12 Znak Mantysa (tu: 6 miejsc) podstawa Wykładnik (tu: 2 miejsca ze znakiem) 3276.14  3.27614 * 10 3 -0.00005413  -5.413 * 10 -5

9 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: uogólnienie ± _._ _ _ _ _ _ * X _ _ _ _ Znak Mantysa (m miejsc) podstawa Wykładnik (n+1 miejsc, w tym 1 na znak) Mantysa znormalizowana: wartość między 1 a X Skończona liczba miejsc na zapis liczby: zbiór liczb, które można zapisać jest skończony! (zbiór dyskretny – tylko pewne konkretne liczby)

10 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: uogólnienie ± _._ _ _ _ _ _ * X _ _ _ _ Znak Mantysa (m miejsc) podstawa Wykładnik (n+1 miejsc, w tym 1 na znak) 1 / 3 = 0.33333333…  3.33333 * 10 -1 W danym systemie niektórych liczb nie można zapisać skończoną ilością cyfr: Utrata części informacji (dokładności) 1 / 3 + 1 / 3 + 1 / 3  9.99999 * 10 -1  1

11 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: uogólnienie ± _._ _ _ _ _ _ * X _ _ _ _ Znak Mantysa (m miejsc) podstawa Wykładnik (n+1 miejsc, w tym 1 na znak) Maksymalny wykładnik: E max = X n -1 (np. X = 10, n=3  E max = 999) Minimalny wykładnik: E min = -X n +1 (np. X = 10, n=3  E min = -999) Minimalna mantysa: M min = 1 Maksymalna mantysa: M max = X – X -(m-1) (np. X = 10, m=4  M max = 10 – 10 -3 = 9.999)

12 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: uogólnienie ± _._ _ _ _ _ _ * X _ _ _ _ Znak Mantysa (m miejsc) podstawa Wykładnik (n+1 miejsc, w tym 1 na znak) Najmniejsza liczba dodatnia: y min = M min * X Emin = 1 * X Emin Największa liczba dodatnia: y max = M max * X Emax = ( X – X -(m-1) ) * X Emax Zbiór liczb: [ - y max, - y min ] oraz [ y min, y max ] (zbiór dyskretny) -y min y min y max -y max y0

13 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: system binarny, format IEEE 754 Liczba rzeczywista w pojedynczej precyzji (float): 4 bajty = 32 bity znakwykładnikMantysa 3130 29 … 24 2322 21 20 … 2 1 0 0 1 0 0 0 0 0 0 11 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 System binarny: pierwszą cyfrą mantysy jest zawsze 1 – nie trzeba poświęcać miejsca na zapisanie jedynki wartosc = (-1) 0 *(1+0.5+0.25+0.125+0.0625) * 2 2 = 7.75

14 i2^(-i) 10.5 20.25 30.125 40.0625 50.03125 60.015625 70.0078125 …… 230.00000011920928955078125 Mantysa: 23 bity. Dokładnie można wyrazić tylko te liczby, których mantysy są wielokrotnościami liczby 2 -23 Dokładność zapisu liczby rzeczywistej: 7 – 8 pierwszych cyfr Wybrane aspekty programowania w C++ (i nie tylko)

15 Zapis zmiennoprzecinkowy: system binarny, format IEEE 754 Pojedyncza precyzja (float): 32 bity Można przedstawiać liczby o modułach od 10 -38 do 10 +38 Liczby o module większym od 10 +38 : bity wykładnika: 1 1 1 1 1 1 1 jeśli wszystkie bity mantysy to zera, to nieskończoność – INF, jeśli nie to NAN Liczby o module od 10 -45 do 10 -39 : bity wykładnika 0 0 0 0 0 0 0 0 mantysa nieunormowana – przed kropką jest 0 (mniej cyfr dokładnych) Liczby o module mniejszym od 10 -45 : bity wykładnika i mantysy wyzerowane otrzymujemy +0 lub - 0

16 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: system binarny, format IEEE 754 y = 19.5 w formacie IEEE 754? Ustalamy, przez jaką potęgę 2 należy podzielić y, aby przed kropką była 1; dobieramy sumę potęg 2 po kropce y = 1.21875 * 2 4 = = (1+ 0*0.5 + 0* 0.25 + 1* 0.125 + 1*0.0625 + 1* 0.03125) * 2 4 znakwykładnikMantysa 3130 29 … 24 2322 21 20 … 2 1 0 0 1 0 0 0 0 0 1 10 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

17 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: system binarny, format IEEE 754 przykład liczby, której nie można przedstawić dokładnie (za pomocą skończonej liczby bitów) y = 1.1 znakwykładnikMantysa 3130 29 … 24 2322 21 20 … 2 1 0 0 0 1 1 1 1 1 1 10 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1

18 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: system binarny, format IEEE 754 przykład dwóch liczb, które mają tę samą reprezentację y = 1.0000003; z = 1.0000004; program „float” znakwykładnikMantysa 3130 29 … 24 2322 21 20 … 2 1 0 00 1 1 1 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1

19 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: system binarny, format IEEE 754 Liczba maszynowa – może się różnić od liczby rzeczywistej Obliczenia wykonywane na liczbach „niedokładnie zapamiętanych” – wyniki obarczone niedokładnościami (mogą narastać wraz ilością operacji) Float – dokładność dla pierwszych 7 - 8 cyfr (również liczby całkowite – prawidłowo dla modułów mniejszych od 16777217, powyżej – mantysa może być za krótka, potrzeba więcej pozycji) Dodawanie liczb maszynowych nie jest przemienne, najpierw dodajemy liczby o najmniejszych modułach Niedokładna wartość liczby: wynik operacji logicznej może być inny niż oczekiwany (np. dwie wartości powinny być równe, a są różne)

20 Wybrane aspekty programowania w C++ (i nie tylko) Zapis zmiennoprzecinkowy: system binarny, format IEEE 754 double – podwójna precyzja: 64 bity 52 bity na zapis mantysy, 11 bitów na wykładnik Można przedstawiać liczby o modułach od 10 -308 do 10 +308 Dokładność dla pierwszych 15 cyfr – nadal nie jest to dokładność idealna (pewnych problemów nie da się wyeliminować)

21 Wybrane aspekty programowania w C++ (i nie tylko) Pisząc program, powinniśmy: Znać ograniczenia poszczególnych typów Mieć świadomość możliwych niedokładności wyników Czytać komunikaty o błędach i uwagi kompilatora Nie traktować wyników w sposób bezkrytyczny Testować program na różne sposoby

22 Wybrane aspekty programowania w C++ (i nie tylko) Wstęp do algorytmiki (1) Problemy niedoświadczonych programistów: Przejście od pisania krótkich programów (kilka – kilkanaście linii) do implementacji algorytmów Projektowanie szczegółów implementacji Praca z plikiem źródłowym, który nie mieści się na jednym ekranie Łatwiej jest napisać program niż poszukiwać w nim błędów!

23 Wybrane aspekty programowania w C++ (i nie tylko) Wstęp do algorytmiki (2) Rozwiązywanie problemów – jak jest? Wprowadzanie drobnych zmian „losowych” (nieprzemyślanych): zmieniam kawałek i sprawdzam, czy jest poprawa. Jeśli nie ma, to znów coś zmieniam i sprawdzam. Taki „ciąg” może być zbieżny do prawidłowego programu, ale metoda się nie sprawdza przy dużych programach.

24 Wybrane aspekty programowania w C++ (i nie tylko) Wstęp do algorytmiki (3) Rozwiązywanie problemów – jak powinno być? Przemyślana implementacja – najpierw się zastanowić i zaplanować, co i jak należy zrobić. Zainwestowanie czasu w „myślenie”, oszczędność czasu w trakcie pisania kodu i testowania.

25 Wybrane aspekty programowania w C++ (i nie tylko) Wstęp do algorytmiki (4) Pisanie programu: Podział programu na funkcje (nie umieszczać wszystkiego w main) Sensowne nazwy zmiennych i funkcji (i czy j są krótkie, ale „licznik” czy „suma” są proste w interpretacji, mniejsza szansa błędu) Przejrzystość (czytelność) kodu (switch zamiast długich serii if – else, wcięcia, komentarze, puste linie,…)

26 Wybrane aspekty programowania w C++ (i nie tylko) Wstęp do algorytmiki (4) Pisanie programu: Czytać komunikaty kompilatora, eliminować błędy i ostrzeżenia. Testowanie, sprawdzanie, co się dzieje np. dla bardzo dużych argumentów, dla argumentów na granicy przedziału itd. Zdrowy rozsądek


Pobierz ppt "Wybrane aspekty programowania w C++ (i nie tylko) Konsekwencje zastosowania systemu binarnego do zapisu wartości liczb Czyli: dlaczego wyniki są złe, mimo."

Podobne prezentacje


Reklamy Google