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 ENDTarkoitus 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.
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.
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
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
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:
Trace/BPT trap (core dumped)
ja ohjelman suorituksen päättymisen. (Tämä virheilmoitus voi johtua
hyvin monesta muustakin syystä.)
EXP
) laskennassa ovat
muutoin samanlaisia kuin reaalilukuoperaatiot mutta eivät välttämättä
aseta lippuja.
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.