Ohjelmointi Unixissa, luku 8 Ohjelmointi Fortran-kielellä:

Numeerinen laskenta Fortranissa

Laskenta aina kaksoistarkkuudella Aix-koneissa

IBM:n Aix-koneet suorittavat liukulukulaskennan aina kaksinkertaisella tarkkuudella. Tietenkin jos laskennan tulos tallennetaan REAL-tyyppiseen muuttujaan, tarkkuutta katoaa. Yleensä uusia ohjelmia tehtäessä kannattaa käyttää kaksoistarkkuuden reaalilukutyyppiä DOUBLE PRECISION.

Kaksinkertainen tarkkuus aiheuttaa joskus yllätyksiä etenkin, jos ohjelmassa pyritään laskemalla määrittämään joitakin koneen aritmetiikan ominaisuuksia. Esimerkiksi seuraava funktio (joka on peräisin kirjasta Fortran 77) ei toimi halutulla tavalla Aix-koneissa:

      REAL FUNCTION EPS()
      EPS = 1
100   EPSNEW = EPS/2
      IF (1+EPSNEW.EQ.1) RETURN
      EPS = EPSNEW
      GOTO 100
      END

Tarkoitus on, että funktio määrittää kone-epsilonin, so. pienimmän positiivisen reaaliluvun epsilon, jolle 1+epsilon on ykkösestä poikkeava. Aix-koneessa kuitenkin funktio palauttaa kaksoistarkkuuden laskentaa vastaavan kone-epsilonin, vaikka käytetyt muuttujat olisivat REAL-tyyppisiä! Tämä johtuu siitä, että kone käyttää ehdon 1+EPSNEW.EQ.1 laskennassa kaksoistarkkuutta. Näin ei kävisi, jos esim. sijoitettaisiin lausekkeen 1+EPSNEW arvo REAL-tyyppiseen apumuuttujaan ja käytettäisiin sitä IF-lauseessa. Helpompi tapa estää tämäntapaiset yllätykset on kuitenkin käyttää kääntäjän optiota

-qrndsngl

joka aiheuttaa sen, että kone laskee yksinkertaisella tarkkuudella sellaiset liukulukulausekkeet, joiden operandit ovat yksinkertaista tarkkuutta.

Nelinkertaisen tarkkuuden luvut

XL Fortranissa (IBM:n Aix-koneiden Fortran) on tyyppi REAL*16 (ja XL C:ssä vastaava tyyppi long double).

Nelinkertaisen tarkkuuden lukuvakioissa käytetään eksponenttikirjaimena Q:ta, joten esim. 1.0Q0 esittää lukua yksi nelinkertaisen tarkkuuden vakiona.

Lukualueet

Aix-koneissa kokonaisluvut ovat 32-bittisiä, joten kokonaislukujen arvoalue on -maxint-1 .. +maxint, missä

maxint = 2**31 - 1 = 2147483647

Aix-koneissa on käytössä IEEE-standardin mukainen reaalilukujen esitys.

Seuraava taulukko esittää eri reaalilukutyyppien lukualueet (pienin positiivinen reaaliluku ja suurin reaaliluku) Aix-tietokoneissa. Lukuarvot ovat tietysti pyöristettyjä. Käytämme tässä reaalilukutyypeistä epästandardeja IBM-tyyppisiä nimiä, joita XL Fortran ymmärtää: REAL*4 on sama kuin REAL ja REAL*8 sama kuin DOUBLE PRECISION, kun taas REAL*16 on standardiin kuulumaton nelinkertaisen tarkkuuden reaalilukutyyppi.

Tyyppi   Lukualue Aix-koneissa

REAL*4   1.175*E-38 .. 3.403E+38   

REAL*8   2.225D-308 .. 1.798D+308  

REAL*16  4.941Q-324 .. 1.798Q+308  

Laskentatarkkuus Aix-koneissa

Kone-epsilon (pienin liukuluku, joka ykköseen lisättynä tuottaa ykkösestä poikkeavan tuloksen) on:

laskentatarkkuus           kone-epsilon Aix-koneissa	

yksinkertainen tarkkuus    1.192E-7
kaksinkertainen tarkkuus   2.220D-16
nelinkertainen tarkkuus    4.940Q-324

Ylivuodot ja muut poikkeustilanteet

Yleensä Aix-koneet eivät anna mitään ilmoituksia ylivuodoista, alivuodoista, nollalla jakamisista yms. numeerisen laskennan poikkeustilanteista (virhetilanteista).

Reaalilukuoperaatio, joka on matemaattisesti määrittelemätön tai jonka tulos on koneen lukualueen ulkopuolella, tuottaa IEEE-standardin mukaisen suureen "infinity", "not a number" tms., joka formatoidusti tulostettuna ei näy lukuna vaan symbolisena merkintänä NaNQ, INF tms.

Tavallisimpien aritmeettisten virheiden käsittely on tarkemmin sanottuna seuraava:

Jos halutaan saada selville esim. matemaattisten funktioiden laskennan virheitä, kannattaa lisätä f77-komentoon optio -lmsaa, koska sen ansiosta saadaan ajonaikaiset virheilmoitukset tilanteista, joissa matemaattista standardifunktiota on kutsuttu argumentilla, joka aiheuttaa laskennassa virhetilanteen. Virhetilanteita aiheuttavat esimerkiksi SQRT-funktion kutsuminen negatiivisella argumentilla ja EXP-funktion kutsuminen niin suurella argumentilla, että tulos ei mahdu lukualueeseen.