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 = możliwości Zakres wartości: od do Przy przekroczeniu górnego zakresu, program zaczyna liczyć od dolnego zakresu (zamiast będzie ) Przy przekroczeniu dolnego zakresu, program zaczyna liczyć od górnego zakresu (zamiast będzie )

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= ; Uwaga, przypisanie błędnej wartości int Azja= ;Błąd Uwaga, przypisanie błędnej wartości long long int Azja= ; prawidłowa wartość (jak unsigned) prawidłowa wartość long long int Azja= ; 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 long long (int) – 8 bajtów, 2 64 możliwości, liczby ujemne i dodatnie rzędu tryliona (od ok do ) Przy deklarowaniu liczby o dużym module – dopisać LL (konieczne w starszym standardzie), w wyrażeniach: (long long)x, (long long) 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= , y= oraz long long z z=x*y – nie otrzymamy ! (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 = …), 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 ± * Znak Mantysa (tu: 6 miejsc) podstawa Wykładnik (tu: 2 miejsca ze znakiem)  *  * 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 = …  * 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

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 – = 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 … … System binarny: pierwszą cyfrą mantysy jest zawsze 1 – nie trzeba poświęcać miejsca na zapisanie jedynki wartosc = (-1) 0 *( ) * 2 2 = 7.75

14 i2^(-i) …… Mantysa: 23 bity. Dokładnie można wyrazić tylko te liczby, których mantysy są wielokrotnościami liczby 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 do Liczby o module większym od : bity wykładnika: jeśli wszystkie bity mantysy to zera, to nieskończoność – INF, jeśli nie to NAN Liczby o module od do : bity wykładnika mantysa nieunormowana – przed kropką jest 0 (mniej cyfr dokładnych) Liczby o module mniejszym od : 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 = * 2 4 = = (1+ 0* * * * * ) * 2 4 znakwykładnikMantysa … …

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 … …

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 = ; z = ; program „float” znakwykładnikMantysa … …

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 cyfr (również liczby całkowite – prawidłowo dla modułów mniejszych od , 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 do 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