Polecenia języków programowania za zwyczaj odnoszą się do różnego rodzaju danych.
Wwewnętrzna organizacja współczesnych komputerów jest binarna (dwójkowa). Oznacza to, że wszystkie dane zapisywane są w formatach binarnych. Standardowo, komputery mogą operować na danych typu całkowitoliczbowego oraz na danych typu niecałkowitego.
Standardowa matematyka operuje znacznie bogatszym zestawem danych. Rozróżniamy:
- Liczby naturalne; według Kroneckera Dobry Bóg stworzył liczby naturalne, inne są dziełem człowieka; liczb naturalnych używamy do liczenia przedmiotów; zbiór liczb naturalnych jest zamnknięty ze względu na opearcje dodawania i mnożenia (żadna z tych operacji nie wyprowadza poza zbiór).
- Liczby całkowite są naturalnym rozszerzeniem liczb naturalnych; zawierają zero i „ujemne liczby naturalne”; zbiór liczb całkowitych jest zamkniety również ze względu na operację odejmowania;
- Liczby wymierne to rozszerzenie zbioru liczb całkowitych skonstruowane tak, żeby powstały zbiór był zamknięty ze względu na na cztery podstawowe operacje arytmetyczne: dodawanie, odejmowanie, mnożenie i dzielenie (liczby wymierne to wszystkie liczby postaci p/q, gdzie p jest całkowite, a q całkowite i różne od zera;
- Korzystając wyłącznie z liczb wymiernych nie da się „zmierzyć” długości przekątnej kwadratu o jednostkowym boku. Zbiór liczb rzeczywistych jest naturalną domeną rachunków różniczkowego i całkowego.
Dodać trzeba, że zbiory liczb naturalnych, całkowitych i wymiernych są równoliczne a każdy z nich zawiera nieskończenie wiele elementów.
Komputery we wszystkich swoich obliczeniach korzystają albo ze skończonego podzbioru liczb całkowitych albo ze skończonego podzbioru liczb wymiernych. Pierwsze liczby nazywane są w Fortranie INTEGER, a drugie — REAL.
Język Fortran zna następujące typy danych:
- INTEGER ogólnie typ całkowity, w szczególnych przypadkach można zadeklarować ile bajtów zostanie zużytych na wartości; do wyboru są wartości 1 (8 bitów), 2 (16 bitów), 4 (32 bity) i 8 (64 bity):
- INTEGER*1
- INTEGER*2
- INTEGER*4
- INTEGER*8
- REAL — ogólnie tyb „rzeczywisty”; do zapisu można używać 32, 64 albo 128 bitów:
- REAL*4
- REAL*8
- REAL*16
- DOUBLE PRECISION czyli REAL*8 — liczby „rzeczywiste” podwójnej precyzji
- COMPLEX — liczby zespolone i DOUBLE COMPLEX — zespolone podwójnej precyzji
- LOGICAL — typ służący do zapisu wartości logicznych (i znowu mimo, że do zapisu wartości logicznej wystarczyłby jeden bit, wykorzystuje się — podobnie jak w przypadku wartości całkowitych — 1, 2, 4 lub 8 bajtów.
- CHARACTER — każda litera kodowana jest jako liczba całkowita. Typ typu CHARACTER przechować może jeden znak.
Jedną z najgorszych cech Fortranu (ale wiem to dopiero po latach) jest brak konieczności deklaracji nazw zmiennych i ich typów. Powoduje to, że następujący kod jest opoprawny:
1 2 3 4 |
1 program test 2 i = 3 ! W tym miejscu deklaruję zmienną całkowitą i, a anstępnie nadaję jej wartość 3 print *, i*2 4 end program test |
Po prostu zakłąda się, że zmienne skalarne o nazwach zaczynających się od litery I, J, K, L, M, N są całkowite, a pozostałe (nazwy zaczynające się od pozostałych liter) — rzeczywiste. Być może jest to wygodne, ale prowadzi do wielu nieporozumień i błędów.
Zwracam również uwagę, że oprócz typów „podstawowych” (INTEGER, REAL, LOGICAL) można używać typów specyficznych, deklarując ilość pamięci niezbędnej do przechowania wartości. I tak INTEGER to będzie typ całkowity o długości 4 bajtów (32 bity) czyli INTEGER*4. Zmienna tego typu może służyć do przechowywania wartości z zakresu od -2,147,483,648 do 2,147,483,647. Natomiast INTEGER*2 (16 btów) jest w stanie służyć do przechowywania wartości całkowitych z zakresu od -32,768 do 32,767. INTEGER*8 to oczywiście liczby całkowite sześćdziesięcioczerobitowe.
Podobnie z typem REAL — odpowiada to trzydziestodwubitowym liczbom zmiennoprzecinkowym z zakresu od 1.17549435E-38 do 3.40282347E38 czyli jest to typ REAL*4. typ DOUBLE PRECISION to inaczej REAL*8 przechowywać może wartości z zakresu 2.2250738585072013D-308 do 1.7976931348623158D308.
Wydaje mi się, że sposób zapisu danych może budzić wiele wątpliwości. SUgeruję następujące lektury dodatkowe:
- Liczby całkowite dodatnie i ze znakiem: od slajdu 52
- Liczby zmiennoprzecinkowe:
- podstawowe informacje: prawie cały wykład
- informacje zaawansowane: na temat typów danych (str. 8), arytmetyka zmiennoprzecinkow i wpływ precyzji na wyniki (str. 39).
Są to wszystko dosyć podstawowe slajdy bądź materiały do zajęć z Technologii Informacyjnych, Informatyki (czyli programowania w języku C) oraz z Metod Numerycznych. Postaram się dodać bogatsze komentarze, pozwalające lepiej zrozumieć problemy związane z arytmetyką komputerów.
Natomiast podkreślić należy, że standardowy typ REAL w języku Fortran (będący odpowiednikiem typu float w języku C) zapewnia niezbyt wielki zakres (1E38) i marną precyzję: 24 cyfry dwójkowe liczby w zapisie „naukowym”. Podkreśłić trzeba, że te 24 cyfry tłumaczą się jako 6 (czasmi 7) znaczących cyfr dziesiętnych. Nie jest to duża precyzja. Dopiero realizacja obliczeń z użyciem liczb podwójnej precyzji (DOUBLE PRECISION albo REAL*8 w języku Fortran albo double w języku C) pozwala osiągnąć i większy zakres liczb (1D308) jak i nieco więcej cyfr znaczących: 53 cyfry dwójkowe, co tłumaczy się na 17 (a czasmi tylko 16) cyfr dziesiętnych.