1. Ett första program i Fortran 90

1.0 Inledning

Det första programmet räknar ut en avrundningsenhet my eller my som ofta användes i samband med numerisk analys av datorberäkningar. Denna konstant kan enklast uppfattas som det halva avståndet mellan 1 och nästa flyttal. Det ger en begränsning av det relativa fel med vilka godtyckliga tal kan lagras som flyttal, om korrekt avrundning sker. Professor William Kahan har angett en listig metod att räkna ut detta värde. Denna metod fungerar på alla datorer som ej har basen tre (eller en multipel av tre).

1.1 Programlistningen för programmet EPSILON

            PROGRAM EPSILON
            IMPLICIT NONE
            REAL :: A, B, C, D, E

            A = 1.0/3.0
            B = 4.0*A - 1.0
            C = 3.0*B - 1.0
            D = 0.5*C

            E = ABS(D)

            WRITE(*,*) ' my = ', E

            END PROGRAM EPSILON
Programmet är som synes skrivet med stora bokstäver (VERSALER), vilket är det vanligaste vid Fortran, men det går numera oftast lika bra att använda små bokstäver (gemena). Processorn gör ingen skillnad mellan små och stora bokstäver, utom vid in- och utmatning.

Första raden ger namnet på programmet, den andra är en mycket bra sats som kommer att diskuteras senare. I den tredje raden talar vi om för systemet att de fem namnen A, B, C, D och E svarar mot flyttal.

Nu följer fyra rader med själva beräkningen. Om du skriver ner det matematiska uttrycket för D får Du 0,5(3(4(1/3)-1)-1) = 0,5(3(4/3-1)-1) = 0,5(3(1/3)-1) = 0,5(1-1) = 0, men det förefaller ju inte meningsfullt att beräkna noll! Det är naturligtvis så att beräkningsfelet är det intressanta här. Den första beräkningen är av en tredjedel, som ej kan representeras exakt på en dator med basen 2, 8, 10 eller 16. Ovanstående innebär bland annat att Du inte får förenkla de fyra satserna för mycket.

Notera att en tredjedel måste skrivas som 1.0/3.0, för att tala om för systemet att det är fråga om flyttal och inte om heltal. De fyra räknesätten anges med + - * respektive /. Notera att i matematik användes ofta en punkt, ett kryss, eller ingenting för att markera multiplikation, som 2·3, a×b, eller 5c, men i Fortran måste asterisken * användas för att markera multiplikation. Tilldelning sker med ett likhetstecken =, varvid storheten till vänster får värdet av det till höger, något kolon lika med som i Algol eller Pascal finns inte. Radslut behöver normalt inte markeras.

Eftersom storheten D kan bli negativ tar vi bort tecknet med hjälp av den inbyggda funktionen ABS.

Utmatningen sker med WRITE-satsen, här utnyttjande standardenheten för utmatning och standardformatet att skriva ut (markerat med de båda asteriskerna). Texten inom apostroferna skrivs ut, följt av värdet på storheten E. Resultatet blir på ett vanligt system (Sun, DEC station, IBM PC eller VAX/VMS)

        my =   5.9604645E-08
och på ett ovanligt system (nämligen Cray)
        my =   7.105427357601E-15
Den sista raden med END talar om för systemet att programmet slutar där.

1.2 Körning av programmet EPSILON på en UNIX-maskin

Den första åtgärden är att ordna en fil som innehåller texten till programmet. Ett lämpligt namn på en sådan fil är epsilon.f90. Filen skapas lämpligen med UNIX standard-editor vi eller den i den akademiska världen vanliga editorn emacs.

Programmet skall nu kompileras, länkas och köras. Detta sker i två steg, först kompilering och länkning med kommandot

        f90 epsilon.f90
och sedan körning med
        a.out
Resultatet finns ovan. Notera att UNIX skiljer på kommandon och filnamn givna med små eller stora bokstäver. Vid användning av Cray (och andra maskiner där PATH inte är satt på normalt sätt) bör aktuell filkatalog anges, varför körning sker med
        ./a.out

1.3 Körning av programmet EPSILON på en VAX/VMS-maskin

Den första åtgärden är att ordna en fil som innehåller texten till programmet. Ett lämpligt namn på en sådan fil är EPSILON.FOR. Filen skapas lämpligen med VAX standard-editor EDT eller TPU eller den vanliga editorn EMACS eller AMIS.

Programmet skall nu kompileras, länkas och köras. Detta sker i tre steg, först kompilering med kommandot

        for epsilon
och länkning med
        lin epsilon
och sedan körning med
        run epsilon
Ovanstående använder Fortran 77 och förutsätter att programmet finns på filen EPSILON.FOR. Programmet måste då ha justerats till Fortran 77. Programmet ovan kräver då fyra mycket små justeringar, rad 2 skall tas bort, i rad 3 skall dubbelkolon :: tas bort, och samtliga rader skall vara inskjutna åt höger minst till position 7. Dessutom skall PROGRAM EPSILON tas bort i den sista raden. En version av programmet i Fortran 77 finns i filen epsilon.f. Resultatet med Fortran 77 blir samma som för de vanliga UNIX-maskinerna. Jag har tyvärr ännu inte tillgång till någon VAX med Fortran 90. Notera att VAX/VMS ej skiljer på kommandon och filnamn givna med små eller stora bokstäver.

1.4 Körning av programmet EPSILON på en MS-DOS-maskin

Den första åtgärden är att ordna en fil som innehåller texten till programmet. Ett lämpligt namn på en sådan fil är EPSILON.F90. Filen skapas lämpligen med MS-DOS standard-editor EDIT eller shareware-editorn EMACS eller EPSILON. Observera att program måste skrivas med en editor (dvs som en ren ASCII-fil) och ej med en ordbehandlare (som lägger till en massa formateringsinformation som kompilatorn inte förstår).

Programmet skall nu kompileras, länkas och köras. Detta kan ske i ett steg vid användning av Fortran 90 från NAG. Först måste man dock ha startat ett hjälpsystem med namnet DBOS, vilket sker med kommandot DBOS (Detta hjälpsystem följer med vid köpet av kompilatorn). Därefter ger man kommandot

        ftn90 epsilon /lgo
Resultatet blir det gamla vanliga. Hjälpsystemet DBOS är ej kompatibelt med alla andra system under MS-DOS, bland annat går det ej att starta Windows när DBOS är aktivt. Man måste därför ibland stänga det med kommandot KILL_DBOS. Man kan däremot starta DBOS när man kör DOS-promptern från Windows. Notera att MS-DOS ej skiljer på kommandon och filnamn givna med små eller stora bokstäver.

Inledning Innehåll Ett andra program


Senast modifierad: 3 maj 1999
boein@nsc.liu.se