48
Vrste podataka « Numeriˇ cke metode » Ivo Batisti´ c Fiziˇ cki odsjek, PMF Sveuˇ cilište u Zagrebu predavanja 2005/2006, dopunjeno 2007

Vrste podataka - >

Embed Size (px)

Citation preview

Page 1: Vrste podataka - >

Vrste podataka« Numericke metode »

Ivo Batistic

Fizicki odsjek, PMFSveucilište u Zagrebu

predavanja 2005/2006, dopunjeno 2007

Page 2: Vrste podataka - >

Pregled predavanja

Digitalni zapis podataka

Imena memorijskih lokacija i ostali znakovi

Osnovne vrste podataka

Cijeli brojevi

Logicki podaci

Znakovi (string-ovi)

Realni brojevi

Page 3: Vrste podataka - >

Digitalni zapis podataka

◮ Na racunalu podaci se zapisuju u digitalnom obliku. Radi se onizu jedinica i nula:

1101011011110011010001010111010110111100110100010101︸ ︷︷ ︸

byte

◮ Svaku jedinicu ili nulu u nizu zovemo bit. Oznacava se s malimslovom ’b’.

◮ Niz od 8 bitova zove se byte. Oznacava se s velikim slovom ’B’.◮ U svijetu racunarstva uobicajeno je koristiti i ove jedinice:

◮ kilobyte: KB - 1024 byte ( 1024 = 210 )◮ megabyte: MB - 1024 KB (1048576 B)◮ gigabyte: GB - 1024 MB◮ terabyte: TB - 1024 GB

◮ Inace po SI sustavu jedinica kilo,mega,giga,. . . oznacavaju redom103, 106, 109, . . .

Page 4: Vrste podataka - >

Digitalni zapis podataka

◮ Mašinske instrukcije koje izvršava CPU (centralni procesor)sadrži adrese podataka u memoriji racunala (RAM).

◮ Pri tome nije moguce adresirati pojedinacne bit ove, nego samogrupe od npr. 4 byte -a ili grupe od 8 byte -ova (novija 64-bitnaracunala).

(Kada treba izdvojiti vrijednost nekog bita, onda se to radi tako dase izdvaja bit unutar skupine bytova koja se nalazi na toj i tojmemorijskoj adresi u racunalu.)

◮ Digitalni zapis podataka prilagoden je ovim hardware-skimuvjetima koje namece racunalo.

Page 5: Vrste podataka - >

Imena memorijskih lokacija (varijabli)

U Fortranskom programu obicno se definiraju imena varijabli, funkcija,procedura, programa, . . .

◮ Imena mogu sadržavati:◮ slova: a-z, A-Z. Nema razlike izedu malih i velikih slova.◮ podvucenu crtu: _◮ brojke: 0-9.

◮ Imena moraju poceti sa slovom (a-z, A-Z).

◮ Dužina imena je obicno ogranicena, tipicno 31 znak.

Page 6: Vrste podataka - >

Ostali zankovi u Fortranu

Znak Ime znaka Znak Ime znaka<TAB> Tab razmak (space)

= jednako + plus- minus * zvjezdica: dvotocka ! usklicnik" dvostruki navodni znak % procent’ jednostruki navodni znak & i (ampersand)

( ) lijeva i desna okrugla zagrada / kosa crta, zarez . tocka; tocka-zarez < manje> više ? upitnik$ dolar

Page 7: Vrste podataka - >

Ogranicenje racunala

◮ Na racunalu nije moguce prikazati brojeve (cijele, realne) nanacin kako ih se u matematici definira.

◮ Npr. za zapis svih decimala broja π(3.14159265358979323846264338328. . . ) mogli bi potrošiticjelokupnu memoriju racunala.

◮ Realni brojevi se spremaju s ogranicenom tocnošcu.

◮ Niti sve cijele brojeve nije moguce prikazati, jer jako veliki cijelibrojevi takoder traže veliki memorijski prostor. Stoga naracunalima postoji i ogranicenje na velicinu brojeva.

Page 8: Vrste podataka - >

Vrste podataka

U FORTRANu postoji nekoliko osnovnih vrsta podataka, te veci brojnjihovih podvrsta.

Niz znakova ili string odredene duljine. Memorijska lokacija serezervira i imenuje naredbom CHARACTER(len=...) ::ime.

Cijeli brojevi koji po apsolutnoj vrijednosti nisu veci od nekogmaksimalnog broja. Memorijska lokacija se imenuje irezervira naredbom INTEGER :: ime.

Realni brojevi koji imaju ogranicen broj decimalnih mjesta, i manji supo iznosu od nekog maksimalno moguceg.

Logicki podaci: istina ili laž.

Iz ovih osnovnih podataka (i njihovih podvrsta) moguce se konstruiratisloženije podatke.

Page 9: Vrste podataka - >

Cijeli brojevi

U stvari radi se o cijelim brojevima po apsolutnoj vrijednosti manjim odnekog maksimalnog broja.

◮ Maksimalni cijeli broj odreden je brojem byte-ova koji se koriste zaspremanje cijelih brojeva. Obicno je rijec o 1,2,4 ili 8 byte-ova.

◮ Memorijski prostor za cijele brojeve rezerviramo koristeci naredbe:

INTEGER (KIND=1):: iINTEGER (KIND=2):: jINTEGER (KIND=4):: kINTEGER (KIND=8):: lINTEGER :: m ! ako KIND nije specificiran

! onda je KIND = 4

◮ Rijec KIND odreduje byte-ova koji se rezerviraju za varijablu. Ali tajbroj ne može biti proizvoljan nego su moguce vrijednosti zadaneprevoditeljem i hardware-om racunala.

Page 10: Vrste podataka - >

Ogranicenja na cijele brojeve

INTEGER (KIND=1) : -128 do +127INTEGER (KIND=2) : -32768 do +32767INTEGER (KIND=4) : -2147483648 do +2147483647INTEGER (KIND=8) : -9223372036854775808 do +9223372036854775807

Digitalni prikaz cijelog broja(kind=1) po bitovima:

binarni decimalni000000002 = 010

010000012 = 6510

011111112 = 12710

100000002 = -12810

100000012 = -12710

111111112 = -110

Digitalni prikaz cijelog broja(kind=2) po bitovima:

binarni decimalni00000000 000000002 = 010

00000000 100000002 = 12810

00000001 000000002 = 25610

01000000 000000002 = 1638410

10000000 000000012 = -3276810

11111111 111111112 = -110

Page 11: Vrste podataka - >

Ogranicenja na cijele brojeve

INTEGER (KIND=1) : -128 do +127INTEGER (KIND=2) : -32768 do +32767INTEGER (KIND=4) : -2147483648 do +2147483647INTEGER (KIND=8) : -9223372036854775808 do +9223372036854775807

Digitalni prikaz cijelog broja(kind=1) po bitovima:

binarni decimalni000000002 = 010

010000012 = 6510

011111112 = 12710

100000002 = -12810

100000012 = -12710

111111112 = -110

Digitalni prikaz cijelog broja(kind=2) po bitovima:

binarni decimalni00000000 000000002 = 010

00000000 100000002 = 12810

00000001 000000002 = 25610

01000000 000000002 = 1638410

10000000 000000012 = -3276810

11111111 111111112 = -110

Postoji 10 vrsta ljudi: jedni koji razumiju binarne brojeve i oni drugi koji ih ne razumiju.

Page 12: Vrste podataka - >

Cijeli brojevi

◮ Izbor velicine cijelog broja preko naredbe KIND=1,2,4,8 jespecifican za Intelov prevoditelj.

◮ Broj koji treba specificirati u naredbi KIND=. . . se može dobiti izfortranske funkcije SELECTED_INT_KIND.

◮ Ako nam trebaju cijeli brojevi unutar podrucja ±10p tadacjelobrojna funkcija SELECTED_INT_KIND(p) vraca podatakkoju vrstu cijelih brojeva treba upotrebiti.

INTEGER, PARAMETER :: i8 = SELECTED_INT_KIND(10)INTEGER(KIND=i8) :: i

◮ Oznaka PARAMETER oznacava da se radi o broju koji jekonstantan, tj. ne može se mijenjati.

Page 13: Vrste podataka - >

Cjelobrojne konstante

a = 654321︸ ︷︷ ︸

Eksplicitno napisani cijeli broj, string, realni broj . . . u programu

zovemo konstantom

◮ Cjelobrojne konstante u decimalnom zapisu sastoje se odznamenki 0-9 te predznaka + ili -. Npr.

-12300+23

10

◮ Osim toga mogu na kraju imati podvucenu crtu iza koje slijedi brojs oznakom vrste cijelog broja:

-12300_4+23_110_i8

Opcenito: i1i2. . . in_K, gdje je K vrstcijelog broja (1,2,4 ili 8).

Page 14: Vrste podataka - >

Cjelobrojne konstante

◮ Konstante se mogu prikazivati i u bazi koja nije 10. Ako baza nijenaznacena onda se baza 10 podrazumjeva.

◮ Za prikazivanje znamenki u bazama vecim od 10 koriste se slovaa− z (a kao 10 do z kao 35).

◮ Npr. u heksadecimalnoj bazi (baza 16) koiste se slova a, b, c, d ,e i f kao znamenke za 10, 11, 12, 13, 14 i 15. Broj 16 udekadskom sustavu piše se kao broj 10 u heksadecimalnom:

010 = 016 1010 = a16

110 = 116 1110 = b16

. . . = . . . . . . = . . .910 = 916 1510 = f16

1610 = 1016

Page 15: Vrste podataka - >

Cjelobrojne konstante

◮ Cjelobrojne konstante u Fortranskom programu, a koje nisudekadske, pišemo:

B’11’ = 3 binarni sustavZ’a1’ = 161 heksadecimalni sustavO’66’ = 54 oktalni sustav

◮ Kako zadati negativne konstante ?

kind=1Z’80’ = -128Z’7F’ = 127Z’FF’ = -1

kind=2Z’80’ = 128Z’7F’ = 127Z’FF’ = 255Z’FFFF’ = -1

Page 16: Vrste podataka - >

Cjelobrojne konstante - primjer

PROGRAM cijeli_brojevi

INTEGER (KIND=1) :: iINTEGER (KIND=2) :: jINTEGER (KIND=4) :: k

i = z’7f’ ! i = 127i = z’80’ ! i = -128i = b’11111111’ ! i = -1j = z’80’ ! j = 128j = z’7fff’ ! j = 32767j = z’8000’ ! j = -32768k = z’ffff’ ! k = 65535k = z’ffffffff’ ! k = -1

END PROGRAM

Page 17: Vrste podataka - >

Operacije s cijelim brojevima

Numeri cke operacijea+b zbrajanjea*b množenjea-b oduzimanjea/b dijeljenje

MOD(a,b) ostatak djeljenja = a - (a/b)*ba**b potenciranje = ab

Rezultat ovih operacija je cijeli broj.

Operacije uspore divanja.LT. ili < manje od.LE. ili <= manje ili jednako.EQ. ili == jednako.NE. ili /= nije jednako.GT. ili > vece od.GE. ili >= vece ili jednako

Rezultat usporedivanja je istina ili laž

Page 18: Vrste podataka - >

Pretvaranje u drugu vrst podataka

CHARACTER(len=5) :: aINTEGER :: ii = 1a = ’1’

Memorijske lokacije a i i sadrže razlicite podatke!

◮ Treba razlikovati matematicku ideju nekog cijelog broja (npr. 1) odnacina kako ga zapisujemo, a posebno kako ga zapisujemo naracunalu.

◮ Na racunalima znakove ’a’, ’b’ . . . , pa tako i znak jedinice ’1’zapisujemo na nacin koji je razlicit od onoga kako sespremaju/zapisiju cijeli brojevi. Svaki znak ima svoj numerickuoznaku. Ove numericke oznake su opcenito razlicite od onoga što tislovcani znakovi inace znace.

Page 19: Vrste podataka - >

Pretvaranje u drugu vrst podataka

Recept za upisivanje decimalnog zapisa cijelog broja u memorijsku lokaciju zastring, i obrnuto (pretvaranje varijabli):

CHARACTER(len=5) :: aINTEGER :: ii = 255WRITE (a,’(I5.5)’) i ! a=’00255’WRITE (a,’(I5)’) i ! a=’ 255’

CHARACTER(len=5) :: aINTEGER :: ia = ’ 255’READ (a,*) iPRINT *,i

Ako pak želimo sadržaj neke memorijske lokacije za cijele brojeve prebaciti umemorijsku lokaciju za realne brojeve složimo se funkcijom: REAL(i).

REAL :: aINTEGER :: ii = 255a = REAL(i)

Page 20: Vrste podataka - >

Naredbe READ i WRITE

◮ Naredba PRINT *,. . . je isto što i WRITE(UNIT=6,*) . . .(ili WRITE(6,*) ili WRITE(*,*)).

◮ Unit=6 oznacava uredaj za ispis, a broj 6 je u fortranu standardnaoznaka za standardni ispis (output) koji operacijski sustavotvara za ispis podataka.

◮ Kod naredne PRINT uredaj za ispis se ne navodi eksplicitno.

◮ Naredba READ(UNIT=5,*) ili READ(5,*) ili READ (*,*) citapodatke s uredaja. Broj 5 oznacava u fortranu uredaj zastandardni unos (input) podataka koje operacijski sustav otvaraza unos podataka.

◮ Uredaje 5 i 6 nije potrebno posebno otvoriti.

◮ U maloprije navedenim primjerima vidimo da je moguce citati iliupisivati iz/u memorijske lokacije za string podatke.

Page 21: Vrste podataka - >

Naredbe READ i WRITE

◮ Zvjezdica kod naredbi PRINT, WRITE i READ služe da prepuštamoprevoditelju da na to mjesto stavi standardne vrijednosti parametara.

◮ Zvjezdica kod naredbe PRINT supstituira vrijednost parametra zanacin ispisa podataka (tz. format ispisa).

◮ Format ispisa je npr. string ’(I5)’ koji znaci da se ispisuje cijeli broj ida je za taj ispis rezervirano 5 mjesta.(cijeli brojevi veci od 5 znamenki nece se dobro ispisati!)

PROGRAM smileCHARACTER(LEN=20) :: strstr = ’:-)’PRINT ’(a5)’,strEND PROGRAM

Umjesto zvjezdice stoji ’(a5)’, štoznaci rezerviraj 5 mjesta za ispisstringa.

Page 22: Vrste podataka - >

Logicki podaci

◮ Logicki podaci imaju dvije vrijednosti: istinu ili laž.

◮ Moguce je rezervirati 1,2,4 ili 8 byte-ova za logicke podatkekoristeci opcionalni parametar KIND.

LOGICAL (KIND=1) :: aLOGICAL (KIND=4) :: bLOGICAL :: cc = .TRUE.a = .FALSE._1b = (2<1) ! ili b = (2 .LT. 1)

◮ Vrijednosti parametra KIND su ovisne o prevoditelju. Tocnevrijednosti mogu se izabrati na isti nacin kao za cijele brojeve(SELECTED_INT_KIND).

Page 23: Vrste podataka - >

Operacije s logickim podacima

.NOT. a pretvara istinu u laž i obrnutoa .AND. b i (and)a .OR. b ili (or)

a .XOR. b ekskluzivni ili (istina ako je samo jedan istinit)a. EQV. b istinito ako su oba ista

Page 24: Vrste podataka - >

Znakovi (string-ovi)

◮ Svaki znak (slovo iz abecede [a-z,A-Z], znamenka broja [0-9],pravopisni znaci [,.:"...]) ima svoju numericku oznaku.

◮ U svijetu postoji ogroman broj razlicitih znakova: latinica, ruskopismo, kinesko pismo, arapsko pismo, grcka slova, matematickiznakovi, itd. Danas se u svijetu pocinje uvoditi zajednickistandard numerickog oznacavanja svih tih simbola i znakova.

◮ Fortran 90 se služi starinskim sustavom po kojem se koristebrojke od 0 do 255 numericke oznake za nešto manje od 200razlicitih znakova.

◮ Postoji stanovita neodredenost o tome koji su to znakovi. Naimeispisivanje znakova prepušteno je operacijskom sustavu.Fortranski program sve što radi jest da kaže operacijskomsustavu da ispiše znakove cije su numericke oznake te i te.... Aoperacijski sustav, prema tome koji standard zapisivanja znakovaima, ispisat ce jednu stvar ili drugu.

Page 25: Vrste podataka - >

Znakovi (string-ovi)

◮ Svaki znak (slovo iz abecede [a-z,A-Z], znamenka broja [0-9],pravopisni znaci [,.:"...]) ima svoju numericku oznaku.

◮ U svijetu postoji ogroman broj razlicitih znakova: latinica, ruskopismo, kinesko pismo, arapsko pismo, grcka slova, matematickiznakovi, itd. Danas se u svijetu pocinje uvoditi zajednickistandard numerickog oznacavanja svih tih simbola i znakova.

◮ Fortran 90 se služi starinskim sustavom po kojem se koristebrojke od 0 do 255 numericke oznake za nešto manje od 200razlicitih znakova.

◮ Postoji stanovita neodredenost o tome koji su to znakovi. Naimeispisivanje znakova prepušteno je operacijskom sustavu.Fortranski program sve što radi jest da kaže operacijskomsustavu da ispiše znakove cije su numericke oznake te i te.... Aoperacijski sustav, prema tome koji standard zapisivanja znakovaima, ispisat ce jednu stvar ili drugu.

Page 26: Vrste podataka - >

Znakovi (string-ovi)

◮ Svaki znak (slovo iz abecede [a-z,A-Z], znamenka broja [0-9],pravopisni znaci [,.:"...]) ima svoju numericku oznaku.

◮ U svijetu postoji ogroman broj razlicitih znakova: latinica, ruskopismo, kinesko pismo, arapsko pismo, grcka slova, matematickiznakovi, itd. Danas se u svijetu pocinje uvoditi zajednickistandard numerickog oznacavanja svih tih simbola i znakova.

◮ Fortran 90 se služi starinskim sustavom po kojem se koristebrojke od 0 do 255 numericke oznake za nešto manje od 200razlicitih znakova.

◮ Postoji stanovita neodredenost o tome koji su to znakovi. Naimeispisivanje znakova prepušteno je operacijskom sustavu.Fortranski program sve što radi jest da kaže operacijskomsustavu da ispiše znakove cije su numericke oznake te i te.... Aoperacijski sustav, prema tome koji standard zapisivanja znakovaima, ispisat ce jednu stvar ili drugu.

Page 27: Vrste podataka - >

Znakovi (string-ovi)

◮ Svaki znak (slovo iz abecede [a-z,A-Z], znamenka broja [0-9],pravopisni znaci [,.:"...]) ima svoju numericku oznaku.

◮ U svijetu postoji ogroman broj razlicitih znakova: latinica, ruskopismo, kinesko pismo, arapsko pismo, grcka slova, matematickiznakovi, itd. Danas se u svijetu pocinje uvoditi zajednickistandard numerickog oznacavanja svih tih simbola i znakova.

◮ Fortran 90 se služi starinskim sustavom po kojem se koristebrojke od 0 do 255 numericke oznake za nešto manje od 200razlicitih znakova.

◮ Postoji stanovita neodredenost o tome koji su to znakovi. Naimeispisivanje znakova prepušteno je operacijskom sustavu.Fortranski program sve što radi jest da kaže operacijskomsustavu da ispiše znakove cije su numericke oznake te i te.... Aoperacijski sustav, prema tome koji standard zapisivanja znakovaima, ispisat ce jednu stvar ili drugu.

Page 28: Vrste podataka - >

ASCII zankovi

0123456789012345------------------------

32 !"#$%&’()*+,-./48 0123456789:;<=>?64 @ABCDEFGHIJKLMNO80 PQRSTUVWXYZ[\]ˆ_96 ‘abcdefghijklmno

112 pqrstuvwxyz{|}~

◮ Ipak, prvih 100-tinjak znakova koji imaju numericku oznaku manjuod 128 uvijek je isto. To su znakovi koji se koriste u engleskomjeziku (pismu). Sustav numerickih oznaka poznat je kao ASCIIstandard.

◮ Ispisivanje znakva numerickih oznaka vecih od 128 ovisi ooperacijskom sustavu i terminalu na kojem se podaci ispisuju.

Page 29: Vrste podataka - >

Nizovi znakova

◮ Memorijski prostor za znakove rezervira se i imenuje fortranskomnaredbom CHARACTER(LEN=N) :: . . . , gdje se s opcionalnimparametrom LEN definira broj znakova u nizu.

◮ Ako dužina niza znakova nije navedena, onda se podrazumjeva da jeona jednaka 1 (LEN=1).

◮ Za svaki znak rezervira se 1 byte u nizu.◮ U memorijsku lokaciju predvidenu za znak upisuje se numericka

oznaka, dakle broj izmedu 0 i 255.

CHARACTER (LEN=1) :: a ! varijabla je dužine jednog! znaka (zauzima 1 byte)

CHARACTER (LEN=255) :: b ! varijabla je dužine 255! znakova (zauzima 255 byte-ova)

CHARACTER*10 c ! alternativni nacin deklaracije

Page 30: Vrste podataka - >

Znakovne konstante

Znakovna konstanta je niz znakova omeden s jednostrukim ilidvostrukim navodnim znakom.

a = ’jednostruki navodni znak’b = "dvostruki navodni znak"c = ’jednostruki navodni znak (”) u stringu’d = ’dvostruki navodni znak (") u stringu’e = ’A’ ! u e je upisan broj 65 !f = ’3’ ! u f je upisan broj 51 !

U memorijsku lokaciju e upisana je numericka oznaka za znak ’A’, tjbroj 65. Numericku oznaku imaju i znamenke dekadskog sustavaNumericku oznaku imaju i znamenke dekadskog sustava brojeva ’0’(48) pa do ’9’ (57), pa i sam razmak kojem je numericka oznaka 32.

Page 31: Vrste podataka - >

Znakovi u C-u

◮ Svaki niz znakova završava s tz. NULL-znakom koji ima numerickuoznaku 0. ( a = "string u c-u"; )

◮ U niz znakova se mogu upisati i neki znakovi koji se ne moguprikazati na ekranu (ili ispisati). Za njihov upis koriste se posebniznakovi od kojih je prvi kosa crta unazad (escape sequence)

◮ U fortranu je niz znakova dugacak onoliko koliko je to deklerirano napocetku kod rezervacije memorijskog prostora. Ako je a ="string u fortranu" , niz znakova se nastavlja iza slova ’u’popunjen razmacima. Ako nam to razmaci smetaju, mogu se uklonitis TRIM naredbom.

posebni znakovi u C-uznak znacenje znak znacenje\v vertikalni TAB \t TAB\a alert (Zvuk) \b pomak unazad\n nova linija \f nova stranica\r povrat na pocetak reda \0 NULL znak\’ jednostruki navodni znak \\ kosa crta u nazad (backslash)\" dvostruki navodni znak

Page 32: Vrste podataka - >

Operacije sa znakovima

Spajanje stringova (// - dvije kose crte)

CHARACTER (LEN=5) :: a = ’jedan’CHARACTER (LEN=3) :: b = ’dva’CHARACTER (LEN=15) :: cc = a // ’ i ’ // b ! c = ’jedan i dva’PRINT *,c

a = ’1’ ; b = ’2’c = a // ’ i ’ // b ! c = ’1 i 2’PRINT *,c

c = TRIM(a) // ’ i ’ // TRIM(b) ! c = ’1 i 2’PRINT *,c

! funkcja TRIM uklanja prazan prostor na kraju stringa

Page 33: Vrste podataka - >

Operacije sa znakovima

Izdvajanje dijela niza znakova - substring

CHARACTER (LEN=100) :: a = ’jednostruki navodni znak’CHARACTER (LEN=5) :: b,cb = a(2:5) ! b = ’edno’c = a(5:2) ! c = ”PRINT *,b

Veza izmedu numerti ckih oznaka i znakova

CHARACTER :: a = ’z’INTEGER :: ii = ICHAR(a) ! i=122PRINT *,ii = i-10a = CHAR(i) ! a=’p’PRINT *,a

Page 34: Vrste podataka - >

Operacije sa znakovima

Duljina niza znakova

CHARACTER (LEN=100) :: a = ’jednostruki navodni znak’PRINT *,’LEN = ’,LEN(a) ! 100PRINT *,’LEN_TRIM = ’,LEN_TRIM(a) ! 24

Traženje pozicije podstringa

CHARACTER (LEN=100) :: a = ’jednostruki navodni znak’CHARACTER (LEN=10) :: b = ’navodni’INTEGER :: ii = INDEX(a,b)PRINT *,i ! i=0i = INDEX(a,TRIM(b))PRINT *,i ! i=13

Page 35: Vrste podataka - >

Realni brojevi

◮ Realni brojevi na racunalu nisu realni brojevi koji postoje umatematici.

◮ U matematici realni brojevi cine kontinuum. Za svaka dva,proizvoljno bliska, realna broja postoji realni broj koji se nalaziizmedu njih. Dapace, izmedu njih se nalazi beskonacno mnogorealnih brojeva.

◮ Na racunalu to nije tako. To je zbog toga što na racunaluprikazujemo realni broj s konacnim brojem byte-ova. Tipicnokoristi se 4, 8 i 16 byte-ova.

◮ Izmedu realnih brojeva na racunalu postoji razmak. A izmedu dvasusjedna NEMA drugih realnih brojeva.

Page 36: Vrste podataka - >

Realni brojevi

Tipicni razmak izmedu dva susjedna realna broja na racunalu je:

4 byte-a (KIND=4) : 1.1920929E-078 byte-ova (KIND=8) : 2.220446049250313E-016

16 byte-ova (KIND=16) : 1.925929944387235853055977942584927E-0034

Oznake, kao npr. 1.0E-7 (≡ 1.0 10−7), je nacin kako racunalo ispisujerealne brojeve u tz. znanstvenoj notaciji.

Ovaj je razmak ujedno numeri cka greška koju cinimo prikazujuci nekipravi realni broj (u principu s beskonacnim brojem decimala) pomocukonacnog broja byte-ova na racunalu.

Numericke operacije s realnim brojevima na racunalu pate od grešaka.Te greške se ponekad mogu akumulirati, i tako dovesto do velikihnepredvidivih grešaka u konacnom rezultatu.

Za numericki rad na racunalu je VAŽNO napraviti analizu akumulacijegrešaka.

Page 37: Vrste podataka - >

Realni brojevi

Tipicni razmak izmedu dva susjedna realna broja na racunalu je:

4 byte-a (KIND=4) : 1.1920929E-078 byte-ova (KIND=8) : 2.220446049250313E-016

16 byte-ova (KIND=16) : 1.925929944387235853055977942584927E-0034

Oznake, kao npr. 1.0E-7 (≡ 1.0 10−7), je nacin kako racunalo ispisujerealne brojeve u tz. znanstvenoj notaciji.

Ovaj je razmak ujedno numeri cka greška koju cinimo prikazujuci nekipravi realni broj (u principu s beskonacnim brojem decimala) pomocukonacnog broja byte-ova na racunalu.

Numericke operacije s realnim brojevima na racunalu pate od grešaka.Te greške se ponekad mogu akumulirati, i tako dovesto do velikihnepredvidivih grešaka u konacnom rezultatu.

Za numericki rad na racunalu je VAŽNO napraviti analizu akumulacijegrešaka.

Page 38: Vrste podataka - >

Digitalni prikaz realnih brojeva

◮ Od ukupnog broja bitova, jedan bit (onaj najviši) se koristi zaoznaku predznaka. Ako je on jednak ’1’, radi se o negativnombroju.

◮ Jedan broj bitova se koristi za binarni prikaz eksponenta.

◮ Ostatak služi za prikaz decimala, pri cemu je decimalni dio uvijekmanji od jedan, a veci od 0.5 (1/2).

π = 3.141592653589793 . . .10 = 11.00100100001111110110101 . . .2

= 0.1100100100001111110110101 . . .2 ·101022

︸ ︷︷ ︸

22

0.1 uvijek postoji jer smo digitalni prikaz broja monožeci/djeleci sa 2(pomicuci decimalnu tocku) doveli u taj oblik. Taj uvijek fiksni diobinarnog prikaza broja se digitalno ne zapisuje, nego samo ostatakdecimala.

Page 39: Vrste podataka - >

Digitalni prikaz realnih brojeva

U digitalnom prikazu realnog broja tako se dobiva jedan ekstra bit, jerse ovaj fiksni dio realnog broja ne bilježi.

Broj bitova namjenjen za prikaz eksponenta i za broj decimalastandardiziran je. Postoje ovi standardi:

Jednostruka preciznost Ukupno se koriste 32 bita (4 byte-a):1 bit - predznak

24 bita - frakcija (decimale) (jedan bit je implicitan)8 bita - eksponent (jedan bit za predznak eksponenta)

Dvostruka preciznost Ukupno se koriste 64 bita (8 byte-a):1 bit - predznak

53 bita - frakcija (decimale) (jedan bit je implicitan)11 bita - eksponent (jedan bit za predznak eksponenta)

Kvadrupolna preciznost Ukupno se koriste 128 bita (16 byte-a):1 bit - predznak

113 bita - frakcija (decimale) (jedan bit je implicitan)15 bita - eksponent (jedan bit za predznak eksponenta)

Page 40: Vrste podataka - >

Primjeri

Jednostruka preciznost3f80 0000 = 1.0c000 0000 = -2.07f7f ffff = 3.4028234 · 1038 (maksimalni broj)3eaa aaaa = 0.3333...(1/3)0000 0000 = 08000 0000 = -07f80 0000 = ∞ (beskona cno)ff80 0000 = - ∞ (beskona cno)

Dvostruka preciznost3ff0 0000 0000 0000 = 1.0c000 0000 0000 0000 = -2.07fef ffff ffff ffff = 1.7976931348623157 · 10308 (maks. broj)3fd5 5555 5555 5555 = 0.3333...(1/3)0000 0000 0000 0000 = 08000 0000 0000 0000 = -07ff0 0000 0000 0000 = ∞ (beskona cno)fff0 0000 0000 0000 = - ∞ (beskona cno)

Page 41: Vrste podataka - >

Realni brojevi

◮ Memorijski prostor za realne brojeve rezerviramo i imenujemokoristeci naredbu REAL (KIND=n), gdje je n jednako 4 (jednostrukapreciznost), 8 (dvostruka preciznost) ili 16 (kvadrupolna preciznost).

◮ Ako vrst realnog broja nije specificirana, ona je po pretpostavcijednaka jednostrukoj preciznosti.

◮ Predefiniranu preciznost je moguce regulirati opcijama prevoditelja.◮ Kvadrupolnu preciznost podržava samo mali broj prevoditelja.

REAL :: a = 1.0REAL (KIND=8) :: b = 1.0REAL (KIND=16):: c = 1.0PRINT *,’KIND=4 :’,SPACING(a)PRINT *,’KIND=8 :’,SPACING(b)PRINT *,’KIND=16 :’,SPACING(c)

Naredba SPACING vraca razmak izmedu susjednih realnih brojeva uracunalu.

Page 42: Vrste podataka - >

Realne konstante - primjeri

REAL :: a = 1.0E-10REAL (KIND=8) :: pi = 3.1415926535897932385REAL (KIND=8) :: e = 2.7182818284590452354REAL (KIND=8) :: e1 = 2.7182818284590452354D0REAL (KIND=8) :: e2 = 2.7182818284590452354_8a=1.0E-100_4PRINT *,a ! ’0.0000000E+00’

! ’3.14159265358979’ - tocnoPRINT *,pi ! ’3.14159274101257’ - ispisuje

! ’2.71828182845905’ - tocnoPRINT *,’e = ’,e ! ’2.71828174591064’ - ispisujePRINT *,’e1 = ’,e1 ! ’2.71828182845905’ - ispisujePRINT *,’e2 = ’,e2 ! ’2.71828182845905’ - ispisuje

Page 43: Vrste podataka - >

Realne konstante

◮ Za oznacavanje ekponenta realne konstante u jednostrukojpreciznosti koristimo slovo E (npr. 1.0E-5 ).

◮ Za oznacavanje ekponenta realne konstante u dvostrukojpreciznosti koristimo slovo D (npr. 1.0D+50 ).

◮ Za oznacavanje ekponenta realne konstante u kvadrupolnojpreciznosti koristimo slovo Q (npr. 1.0Q-500 ).

◮ Preciznost se može naznaciti i podvucenom crtom na kraju izakoje slijedi broj 4, 8 ili 16 (npr. 1.0_16 ).

Page 44: Vrste podataka - >

Realni brojevi

◮ Izbor vrste realnog broja preko KIND naredbe ovisi o prevoditelju.Vrijednosti 4, 8 i 16 specificne su za Intelov prevoditelj.(Za Salfordov prevoditelj KIND može biti 1,2 ili 3).

◮ Tocne vrijednosti mogu se dobiti iz funkcijeSELECTED_REAL_KIND(p,e) koja vraca broj koji treba navesti uKIND naredbi, pri cemu je traženi broj tocnih decimalnih mjesta p,a 10±e tražena vrijednost eksponenta.

INTEGER, PARAMETER :: r8 = SELECTED_REAL_KIND(15,30)REAL(kind=r8) :: a = 1.2345678901234567890123456789_r8

Page 45: Vrste podataka - >

Operacije s realnim brojevima

◮ Numeri cke operacijea+b zbrajanjea*b množenjea-b oduzimanjea/b dijeljenjea**b potenciranje (ab)

◮ Operacije usporedivanja (isto kao kod cijelih brojeva)

◮ Pretvaranjecijeli broj realni brojINT(a) a

i REAL(i)

Page 46: Vrste podataka - >

Funkcije

Jedan mali podskup od mnoštva funkcija:

Funkcija što radiABS (a) absolutna vrijednostSIGN (a,b) vrijednost od a s predznakom od b-aSQRT (a) kvadratni korjenSIN (a) sinus od a (argument u radijanima)COS (a) kosinus od aTAN (a) tanges od aASIN (a) arkus sinus - inverzna funkcija od sinusaACOS (a) arkus kosinusATAN (a) arkus tanges od aEXP (a) eksponent (prirodni)LOG (a) prirodni logaritamLOG10 (a) logaritam u bazi 10SINH (a) hiperbolicni sinusCOSH (a) hiperbolicni kosinusTANH (a) hiperbolicni tanges

Page 47: Vrste podataka - >

Primjer

PROGRAM piREAL(KIND=16) :: a = 1.0_16, bb = 4.0_16 * ATAN(a)PRINT *,b! ispisuje: ’3.14159265358979323846264338327950’END PROGRAM

PROGRAM konverzijaREAL :: aa = 1/(1 + 1)PRINT *,a ! ispisuje: 0.0000000E+00a = 1.0/(1 + 1)PRINT *,a ! ispisuje: 0.5000000END PROGRAM

Page 48: Vrste podataka - >

Pretvaranje cijelih brojeva u realne

◮ Kod operacija koje sadrže cijele i realne brojeve, cijeli brojevi seautomatski konvertiraju u realne, a rezultat se automatskikonvertira u tip podatka koji stoji na lijevoj strani znaka jednakosti.

◮ U izrazima koji sadrže samo cijele brojeve i rezultat je cijeli brojkoji se potom pretvara u vrst podatka na lijevoj strani znakajednakosti.

Stoga u navednom primjeru PROGRAM konverzija i dobivamonulu: na desnoj strani izraz sadrži samo cjele brojeve i rezulat je cijelibroj (tj. nula) koja se potom konvertira u realni broj na lijevoj strani.Ako se u izraz na desnoj strani umiješa realna konstanta, onda se cijelibrojevi prvo pretvaraju u realne, a tek onda se izvode numerickeoperacije.