06 Typy danych

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:

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:

  1. Liczby całkowite dodatnie i ze znakiem: od slajdu 52
  2. Liczby zmiennoprzecinkowe:
    1. podstawowe informacje: prawie cały wykład
    2. 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.