1 Wstęp
Komputery uchodzą za mistrzów obliczeń. Dziś rozprawiamy się z tym poglądem!
1.1 Cel laboratorium
Celem laboratorium jest znalezienie przez studentów przykładów błędów popełnianych przez komputery podczas prostych obliczeń oraz oszacowanie ich wielkości.
1.2 Wymagania
1.3 Pytania
- Konwersja liczb dziesiętnych na dwójkowe:
- całkowitych,
- ułamkowych.
- Sposób zapisu liczb całkowitych (dodatnich i ujemnych) w komputerach.
- Sposób zapisu liczb „niecałkowitych”:
- stałoprzecinkowych,
- zmiennoprzecinkowych.
- Błąd bezwzględny.
- Wartość dokładna.
- Wartość przybliżona.
1.4 Materiały on line
- Zanurkuj w Pythonie [1]
- Dokumentacja on-line (po angielsku) [2]
- Learn Python The Hard Way (po angielsku) [4]
- Python Programming (po angielsku) [3]
2 Struktura laboratorium
3 Zadania do wykonania
- Uruchamiamy program python (najpierw trzeba otworzyć terminal tak jak to opisano w pierwszej instrukcji laboratoryjnej)1 albo uruchomić zintegrowane środowisko programistyczne do pythona idle. Naciskamy ikonę w lewym, górnym rogu ekranu i zcaczynamy pisać „idle” (albo „python”)
i klikamy w ikonę.
Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39)
[GCC 4.4.5] on linux2
Type „help”, „copyright”, „credits” or „license” for more information.
>>>
- Rzogrzewka
- napisz 2*2
4
- napisz 7/2
>>> 7/2
3 - napisz 7./2
>>> 7./2
3.5Skomentuj różnicę!
- napisz 0.1
>>> 0.1
0.1 - napisz 0.2
>>> 0.2
0.2Jak się wydaje takie proste operacje nie sprawiają programowi kłopotu, ale…
- napisz 0.1+0.2
>>> 0.1+0.2
0.30000000000000004
Co więcej, Python (ale inne języki programowania postępują identycznie) stara się starannie ukrywać to jak (nie)dokładnie wykonuje obliczenia. Można go poprosić żeby pokazał na jakich dokładnie liczbach działa:
>>> Decimal(2.675)
Decimal(’2.67499999999999982236431605997495353221893310546875’)
Zobaczmy też:
0.5
>>> 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
0.7999999999999999
>>> 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
0.9999999999999999
Poniższe tłumaczy dlaczego tak się dzieje:
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type „help”, „copyright”, „credits” or „license” for more information.
>>> from decimal import Decimal
>>> Decimal(0.1)
Decimal(’0.1000000000000000055511151231257827021181583404541015625’)
- Znajdź kolejne przykłady (co najmniej 5 różnego typu) „źle” wykonywanych obliczeń. Dla każdego przykładu wylicz błąd bezwzględny i względny2.
- Opisz metodę konwersji liczb dziesiętnych (0.1, 3.1415, 0.3333333) całkowitych i ułamkowych na dwójkowe
- dokonaj konwersji kilku niecałkowitych liczb dziesiętnych do postaci dwójkowej, zapisując wynik jako liczbę:
- ośmiobitową
- szesnastobitową
- trzydziestodwubitową
- w każdym przypadku dokonaj konwersji odwrotnej i policz błąd bezwzględny i względny
- Sprawdź, dla jakich różnic wykładników komputer zacznie (będzie) prawidłowo wyliczać wartość wyrażenia
. Dla przypomnienia: demonstrowany na wykładzie przykład to a = 1.0e+20 oraz b = 1.0e-20
- Najpierw zastanów się jaka „powinna” być wartość
i
!
4 Materiały pomocnicze
4.1 Python
Python jest językiem programowania wysokiego rzędu przeznaczonym do rozwiązywania najróżniejszych zadań (język programowania ogólnego przeznaczenia). Historia jego jest już dosyć długa: używany jest od 19 lat.
Może być stosowany do tworzenia różnego rodzaju aplikacji, ale także do prowadzenia obliczeń w trybie doraźnym (ad-hoc).
Python jest wykorzystywany bardzo szeroko: standardowo dołączany jest do systemu Linux i Mac OS. Używany jest bardzo szeroko przez:
- Google,
- YouTube,
- BitTorrent został napisany w Pythonie,
- Industrial Light & Magic, Pixar, używają oprogramowania napisanego w Pythonie do produkcji swoich filmów animowanych,
- …
Dla osób znających inne języki programowania pomocne mogą być zestawienia umieszczone w serwisie Hyperpolyglot Programming Languages Reference Sheets.
4.2 Uruchomienie
Obliczenia „ad-hoc”:
- Klikamy w logo (w lewym górnym rogu) i piszemy w okienku „python” albo „idle”
- Uruchamiamy terminal (albo Ctrl-Alt-T albo klikamy w logo i piszemy terminal); w otwartym okienku piszemy python. item W otwartym terminalu możemy napisać idle, żeby uruchomić sympatyczne środowisko graficzne pythona:
Przygotowanie i uruchomienie programu:
- Korzystając z dowolnego edytora tekstowego (polecam gedit) tworzymy plik o rozszerzeniu .py (na przykład test.py) i wpisujemy do niego program.
- Otwieramy terminal (Ctrl-Alt-T) i w tym terminalu piszemy python test.py
Utworzenie samodzielnej aplikacji:
- Tworzymy plik z programem (test.py) za pomocą dowolnego edytora pamiętając aby jako pierwsza linia wystąpiło:
- Po zapisaniu pliku nadajemy mu „atrybut wykonywalności” pisząc w terminalu
chmod +x test.py
albo odpowiednio modyfikujemy właściwości pliku (prawy klawisz myszy na pliku w menedżerze plików i wybieramy Właściwości i w zakładce Uprawnienia ustawiamy ptaszka przy „Zezwolenie na wykonywanie pliku jako programu”.
- Aplikację uruchamiamy poleceniem
./test.py
w terminalu lub klikając myszą w menedżerze plików.
4.3 Operacje arytmetyczne
Podstawowe operacje () działają tak jak można się spodziewać. Operacja dzielenia (
) może sprawiać pewne kłopoty:
1
Dopiero napisanie
1.5
>>> 3/2.
1.5
>>>
daje oczekiwany efekt.
Potęgowanie oznaczane jest znakiem , zatem 3 do potęgi trzeciej (
) wygląda tak:
27
Inne operatory arytmetyczne to % — reszta z dzielenia albo modulo: 3 dzielone przez dwa to 1 (bo dwójka mieści się w trójce całkowicie jeden raz) i reszta 1:
1
W bardziej skomplikowanych obliczeniach można posługiwać się podstawowym zestawem funkcji (tak zwane funkcje wbudowane):
- abs wartość bezwzględna
- divmod(a,b) zwraca wynik dzielenia całkowitoliczbowego i resztę z dzielenia jako parę liczb
1.5
>>> 2/2.
1.0
>>> 3/2.
1.5
>>>
- float konwertuje liczbę do postaci zmiennoprzecinkowej
3.0
- round(x[,n]) zaokrągla liczbę do n miejsc po przecinku:
3.0
>>> round(3.1415,1)
3.1
Użycie innych funkcji matematycznych wymaga specjalnych zabiegów: podpowiedzenia programowi, że będziemy chcieli z nich korzystać:
mówi, że zechcemy używać modułu math zawierającego różne funkcje i stałe matematyczne. Po wydaniu tego polecenia możemy napisać:
0.70710678118654757
>>> math.log(1024, 2)
10.0
>>> math.pi
3.1415926535897931
Dostępne stają się funkcje trygonometryczne, hiperboliczne, logarytmiczne i wykładnicze, funkcje specjalne oraz stałe: i e
2.7182818284590451
Z całej biblioteki można zaimportować tylko pojedynczą funkcję
4.4 Obliczenia
W prostych obliczeniach można korzystać z pythona jak z podręcznego kalkulator: wyniki obliczeń podawane będą na bieżąco. Można też wyniki zapamiętywać (coś jak pamięci kalkulatora). Z tym, że poszczególne pamięci możemy nazywać według naszego uznania:
>>> obwod=2*math.pi*r
>>> pole=math.pi*r**2
Podanie w linii nazwy pamięci (zmiennej) powoduje wydrukowanie jej wartości:
5
>>> r, pole
(5, 78.539816339744831)
>>> r, pole, obwod
(5, 78.539816339744831, 31.415926535897931)
4.5 Bloki instrukcji
Cechą odróżniającą język python od innych języków (Na przykład C czy Pascal) jest sposób wyróżniania bloków instrukcji. W języku C używa się do tego nawiasów klamrowych {}, a w języku Pascal słów kluczowych begin i end.
W pythonie używa się „wcięć”.
Potrzeba korzystania z bloków instrukcji pojawia się, między innymi:
- podczas wykonywania instrukcji warunkowych,
- przy tworzeniu pętli,
- podczas definiowania funkcji.
Na przykład:
Poniżej przykład programu rozwiązującego równanie kwadratowe:
from math import sqrt
A = raw_input(„A:␣„)
B = raw_input(„B:␣„)
C = raw_input(„C:␣„)
a = float(A)
b = float(B)
c = float(C)
delta = b*b – 4*a*c
if delta > 0:
x1 = (-b – sqrt(delta))/(2*a)
x2 = (-b + sqrt(delta))/(2*a)
print „x1␣=␣„, x1
print „x2␣=␣„, x2
elif delta == 0:
x = –b/2/a
print „x␣=␣„, x
else :
print „Nie␣ma␣pierwiastkow␣rzeczywistych!„
Uwagi:
- Program można sobie ściągnąć i zapisać: trojmian.py, a później uruchomić w terminalu wypisując python trojmian.py albo uruchamiamy idle, otwieramy plk źródłowy File
Open i uruchamiamy Run
Run module albo naciskając klawisz F5.
- Funkcji float została użyta aby skonwertować tekst (ciąg znaków) do liczby. Informacje wczytywane z terminala funkcją raw_input są typu tekstowego!
4.6 Instrukcje warunkowe
Instrukcja warunkowa używana jest podczas programowania do wprowadzenia rozgałęzienia w zależności od wartości jakiegoś parametru czy spełnienia jakiegoś warunku. Typowy przykład konieczności wprowadzenia instrukcji warunkowej to program wyliczania rzeczywistych miejsc zerowych trójmianu kwadratowego. W zależności od wartości parametru albo wyliczamy jeden pierwiastek rzeczywisty, albo dwa, albo musimy stwierdzic, że pierwiastków rzeczywistych nie ma.
Fragment programu wyliczającego pierwiastki przedstawiono w poprzednim rozdziale. (Tam gdzie się kończy wcięcie — kończy się zakres działania odpowiedniego fragmentu warunku.)
4.7 Pętle
Pętla to taka konstrukcja programistyczna, która nakazuje wykonanie jakiejś czynności:
- kilka razy
- tak długo aż jakiś warunek zostanie spełniony.
W obu powyższych przypadkach efekt powinien być taki:
4
5
6
7
8
9
10
11
(Oczywiście nie ma wielkiej różnicy pomiędzy tymi sytuacjami, ale, tradycyjnie, robione jest takie rozróżnienie).
5 Wersja PDF instrukcji
Literatura
[1] Mark Pilgrim. Zanurkuj w Pythonie. WikiBooks, 2010. http://pl.wikibooks.org/wiki/Python.
[2] Python documentation index. http://www.python.org/doc/, Wrzesie/n 2010.
[3] Python Programming. WikiBooks, 2010. http://en.wikibooks.org/wiki/Python_Programming.
[4] Zed A. Shaw. Learn Python The Hard Way. 2010. Release 3: http://learnpythonthehardway.org/book/.
Wersja: 7 z drobnymi modyfikacjami!z dnia 2015-10-23 10:01:05 +0200