Appendix 7. Andra Fortran 90/95 system

A 7.0 Inledning

Nedan presenteras ett antal kompilatorer för Fortran 90 och Fortran 95.

IBM har XL Fortran för operativsystemet AIX på RS/6000, vilken trots namnet är en fullständig Fortran 95 kompilator. Se vidare The Fortran Family: The Scientific Compilers.

Fujitsu har likaså en Fortran 95 kompilator för Solaris och Linux.

Portland-gruppen har en HPF Fortran 90 kompilator för flera olika system.

Microsoft har inte längre Fortran i sitt sortiment.

Apogee Software, Inc., Campbell, California har en Fortran 77/90 kompilator för Sun SPARC.

Av de olika kompilatorerna har jag enbart provat de från NAG, Cray, Digital och Sun, och alla med mycket gott resultat.

Ytterligare kompilator-länkar finns på min Fortran sida.

A 7.3 Cray

Från Cray finns Fortran 90, se Cray F90 Programming Environment.

A 7.3.1 Systemparametrar på Cray C90

Systemparametrar på Cray C90, utnyttjande Cray's Fortran 90 kompilator. Jämför motsvarande tabell för NAG i föregående appendix. Som synes utnyttjar Cray antalet bytes som KIND-parameter. Cray tillåter värdena 1, 2, 4 och 8 för logiska variabler (med samma resultat som skönsvärdet 8), värdena 1, 2, 4, (6) och 8 för heltal, samt värdena 4, 8 och 16 för flyttal och komplexa tal. Nedanstående tabell hänför sig till CF90 1.0.1,1.0.2 och 2.0.0.0. I CF90 3.0.1.0 är däremot skönsvärdet för heltal ändrat från 6 till 8, och hela KIND = 6 och int46 är helt borttagna. Benämningen half för fallet KIND=4 är min egen! Likaså är benämningarna int7, int15, int31, int46 och int63 mina egna.

Anm. Mina tester tyder på att half inte är fullständigt implementerat på Cray Y-MP, utan att man i verkligheten får variabler med normal precision (nedan kallad single). Information från Cray tyder vidare på att half införts för att få viss kompatibilitet med Cray T3D, på vilken maskin den precisionen verkligen finns.

LOGICAL               Default
  KIND number =             8

INTEGER              (Default)          int7               int15
 KIND number =             (6)             1                   2
      digits =             46              7                  15
       radix =              2              2                   2
       range =             13              2                   4
        huge = 70368744177663            127               32767
    bit_size =             46              8                  16

INTEGER                 int31         (int46)              int63
 KIND number =              4             (6)                  8
      digits =             31             46                  63
       radix =              2              2                   2
       range =              9             13                  18
        huge =     2147483647 70368744177663 9223372036854775807
    bit_size =             32             46                  64

REAL                       half  Default, single          double
  KIND number =               4                8              16
       digits =              24               47              95
  maxexponent =            8189             8189            8189
  minexponent =           -8188            -8188           -8188
    precision =               6               13              28
        radix =               2                2               2
        range =            2465             2465            2465
      epsilon =  0.11920929E-06   0.14210855E-13  0.50487098E-28
         tiny = 0.73344155-2465  0.73344155-2465 0.73344155-2465
         huge = 0.13634352+2466  0.13634352+2466 0.13634352+2466

COMPLEX                    half  Default, single          double
  KIND number =               4                8              16
    precision =               6               13              28
        range =            2465             2465            2465

Jag listar här de viktigaste tilläggen till kompileringskommandot på Cray. Gör gärna kommandot man f90 för en mer fullständig information.
 -c          Enbart kompilering (ej länkning)
 -C          Skapar en informationsfil
 -d          Stänger av (Disable) kompileringsvillkor
 -e          Slår på (Enable) kompileringsvillkor 
 -f fixed    Gamla formen av källkod
 -f free     Nya formen av källkod
 -g          Skapar avlusningsinformation
 -i          Väljer heltalslängd
 -I incldir  Fortran 90 söker efter filer
             som inkluderas med Fortran INCLUDE sats
             i angivet directory (filkatalog)
 -l          Länkning av bibliotek
 -L          Biblioteksdirectory
 -m          Anger felnivån
 -N          Specificerar 72 eller 80 kolumner 
             vid fix form. Vid fri form gäller
             alltid 132 kolumner
 -o          Namnsätter det färdiga programmet
 -O          Optimering
 -p pathname Fortran 90 söker automatiskt efter
             moduler i aktuellt directory,
             eventuella directoryn i I-listan,
             samt /usr/local/lib/f90.        
 -r          Producerar kompileringslista
 -S          Producerar källkod i assembler
 -v          Kommenterar hur kompileringen fortskrider
 -V          Ger kompilatorns versionsnummer
 -Wl         Sänder information till länkaren segldr
Det passar att här nämna att Cray tillåter användning av beteckningar som REAL*8 i stället för REAL och REAL*16 i stället för DOUBLE PRECISION, liksom användning av beteckningen DOUBLE PRECISION*16 för extremt hög precision, men dessa är införda av kompatibilitetsskäl gentemot existerande utvidgningar av Fortran 77, och bör ej användas i nyskriven kod.

A 7.3.2 Systemparametrar på Cray T3E

Systemparametrar på Cray T3E, utnyttjande Cray Fortran 90 kompilatorn ges här. Jämför gärna med Cray C90 tabellen, Digital Alfa tabellen och NAG tabellen. Notera att Cray använder antalet oktadgrupper (bytes) för KIND värdet. Cray tillåter likaså värdena 1, 2 och 4 för logiska variabler som tillägg till skönsvärdet 8, värdena 2, 4 och 8 för heltal och endast värdena 4 och 8 för flyttal och komplexa tal. Beteckningarna int15, int31 och int63 är mina egna.

INTEGER                     default
 KIND number =                    8
      digits =                   63
       radix =                    2
       range =                   18
        huge =  9223372036854775807
    bit_size =                   64
  
INTEGER                  int15          int31               int63
 KIND number =               2              4                   8
      digits =              15             31                  63
       radix =               2              2                   2
       range =               4              9                  18
        huge =           32767     2147483647 9223372036854775807
    bit_size =              16             32                  64
  
LOGICAL              Default        byte    halfword
  KIND number =            8           1           2
LOGICAL              Default        word      double
  KIND number =            8           4           8

REAL                      single          double         default
  KIND number =                4               8               8
       digits =               24              53              53
  maxexponent =              128            1024            1024
  minexponent =             -125           -1021           -1021
    precision =                6              15              15
        radix =                2               2               2
        range =               37             307             307
      epsilon =   0.11920929E-06  0.22204460E-15  0.22204460E-15
         tiny =   0.11754944E-37  0.22250739-307  0.22250739-307
         huge =   0.34028235E+39  0.17976931+309  0.17976931+309
  
COMPLEX                  single         double
  KIND number =               4              8
    precision =               6             15
        range =              37            307

A 7.4 Digital

Digital Equipment Corporation (nu HP) har Fortran 90/High Performance Fortran, vilken är en riktig Fortran 90 kompilator kompletterad med HPF, samt möjlighet till generering av kod för parallell exekvering för effektivt utnyttjande av flera arbetsstationer. DEC Fortran 90 finns under Digital Unix (mer känt som OSF/1) för Alpha-processorn, och under OpenVMS för Alpha-processorn.

A 7.4.1 Systemparametrar på Digital UNIX

Systemparametrar på Digitals Alpha-maskiner, utnyttjande Digitals UNIX och Fortran 90 kompilator ges nedan. Jämför motsvarande tabell för NAG i föregående appendix eller för Cray i detta appendix.

Som synes utnyttjar Digital (liksom Cray) antalet bytes som KIND-parameter. Digital tillåter värdena 1, 4, 8 och 16 för logiska variabler (med samma resultat som skönsvärdet 4), värdena 2, 4 och 8 för heltal, värdena 4, 8 och 16 för flyttal, samt värdena 4 och 8 för komplexa tal. Benämningen quad för fallet KIND=16 är min egen! Likaså är benämningarna int15, int31, och int63 mina egna.

LOGICAL              Default        byte        word
  KIND number =            4           1           4
LOGICAL              Default      double        quad
  KIND number =            4           8          16

INTEGER                  int15          int31               int63
 KIND number =               2              4                   8
      digits =              15             31                  63
       radix =               2              2                   2
       range =               4              9                  18
        huge =           32767     2147483647 9223372036854775807
    bit_size =              16             32                  64

REAL                      single          double            quad
  KIND number =                4               8              16
       digits =               24              53             113
  maxexponent =              128            1024           16384
  minexponent =             -125           -1021          -16381
    precision =                6              15              33
        radix =                2               2               2
        range =               37             307            4931
      epsilon =   0.11920929E-06  0.22204460E-15  0.19259299E-33
         tiny =   0.11754944E-37  0.22250739-307 0.33621031-4931
         huge =   0.34028235E+39  0.17976931+309 0.11897315+4933

COMPLEX                  single         double
  KIND number =               4              8
    precision =               6             15
        range =              37            307

A 7.4.2 Kompilering på Digital UNIX

Jag listar här de viktigaste tilläggen till kompileringskommandot på Digital. Gör gärna kommandot man f90 för en mer fullständig information.

Källkod i fix form bör ha filtypen .f, .for eller .FOR, medan den i fri form bör ha filtypen .f90.

Notera speciellt att det är möjligt att utnyttjande dessa tillägg ställa om heltal (med integer_size), flyttal (med real_size) och flyttal i dubbel precision (med double_size) till önskad bit-längd (antal bytes). Eftersom processorn är en 64-bits maskin är det lämpligt att använda 64-bitar för flyttalen, dvs använda tillägget -real_size 64 eller enklare -r8.

 -c          Enbart kompilering (ej länkning)
 -C          Indexkontroll
 -double_size 64 	(default, skönsvärde)  
 -double_size 128 	(dubbel precision blir fyrdubbel)
 -f fixed    Gamla formen av källkod (fix form)
 -f free     Nya formen av källkod (fri form)
 -g          Skapar avlusningsinformation
 -i          Väljer heltalslängd. Använd något av
 -i2 			eller integer_size 16
 -i4 			eller integer_size 32 	(default, skönsvärde)
 -i8 			eller integer_size 64
 -Idir       Fortran 90 söker efter filer
             som inkluderas med Fortran INCLUDE sats
             i angivet directory (filkatalog)
 -l          Länkning av bibliotek
 -o          Namnsätter det färdiga programmet
 -O          Optimering
 -pg	     Genererar exekveringsprofil att användas 
	     av gprof
 -real_size 32 		(default, skönsvärde)
 -real_size 64  	eller -r8
 -real_size 128 	eller -r16
 -u          Medför IMPLICIT NONE utan att detta angetts explicit
 -v          Kommenterar hur kompileringen fortskrider
 -V	     Skriv ut källkoden med filtypen .l
 -version    Ger kompilatorns versionsnummer
 -vms        Ger vissa VAX VMS egenskaper (byter EJ till VAX-aritmetik)
 -w	     Undertrycker varningar

A 7.4.3 Några körexempel på Digital UNIX

Eftersom DEC Alpha är en 64-bitarsmaskin är det speciellt intressant att titta på olika precisioner, speciellt hur enkel och fyrdubbel precision uppför sig, samt hur man byter mellan de olika precisionerna.

Mina tester tyder på att den följer IEEE 754 korrekt (enkel och dubbel precision, högre precision är ännu ej standardiserad).

Avrundningskonstanten

Det första exemplet är beräkningen av avrundningskonstanten my i kapitel 1, programmet EPSILON. Detta program, som är skrivet i normal enkel precision, finns på filen epsilon.f90. Jag har nedan kört det med de tre olika möjliga precisionerna.
% f90 epsilon.f
% a.out
  my =   5.9604645E-08
% f90 -r8 epsilon.f
% a.out
  my =   1.110223024625157E-016
% f90 -r16 epsilon.f
% a.out
  my =   9.629649721936179265279889712924637E-0035
% 

Tre precisioner på en gång

Det andra exemplet är summation framlänges och baklänges, programmet SUMMA. Detta program finns på filen summa.f90. Programmets matematiska/numeriska uppgift är att visa att summation med början på de minsta storheterna ger det mest noggranna resultatet. I ett svep klarar detta program alla tre möjliga precisionerna.

Enkel precision och dubbel precision deklareras som vanligt med REAL respektive DOUBLE PRECISION, medan för den fyrdubbla precisionen utnyttjas möjligheten att införa en egen precision, vilken jag ger namnet QUAD. Definitionen utnyttjar funktionen SELECTED_REAL_KIND för att erhålla ett lämpligt slag (KIND-nummer), jämför avsnitten 10.3 och 10.4.

% f90 summa.f90
% a.out
Hur många tal vill Du summera? 1e6
Vill Du summera framlänges (F) eller baklänges (B)? f
 Summation framlänges av      1000000  tal.
 Summan i enkel precision      =    1.644725    
 Summan i dubbel precision     =    1.64493306684877     
 Summan i fyr-dubbel precision =    1.64493306684872643630574849997952
% a.out
Hur många tal vill Du summera? 1e6
Vill Du summera framlänges (F) eller baklänges (B)? b
 Summation baklänges av      1000000  tal.
 Summan i enkel precision      =    1.644933    
 Summan i dubbel precision     =    1.64493306684873     
 Summan i fyr-dubbel precision =    1.64493306684872643630574849997939
% 
Det går bra att ställa om dubbel precision till fyrdubbel genom att kompilera programmet summa.f90 med
% f90 -double_size 128 summa.f90
men det går inte att ställa om enkel precision, eftersom noteringen 0.0_QUAD då ger kompileringsfel. Om jag ersätter denna med 0.0 (och motsvarande för övriga konstanter) ger
% f90 -r8 summa.f90
att enkel och dubbel precision båda blir dubbel precision, medan fyrdubbel precision förblir oförändrad. Om man däremot ger
% f90 -r16 summa.f90
sker samtliga beräkningar i fyrdubbel precision.

A 7.5 Absoft Pro Fortran

Detta avsnitt skrevs av Michael Rice vid Absoft den 29 januari 1997, och har översatts av Bo Einarsson.

A 7.5.1 Inledning

     Absoft Corporation
     2781 Bond Street
     Rochester Hills, MI 48309 USA
     sales@absoft.com
     Tel: +1 (248) 853 0050
     Fax: +1 (248) 853 0108
Pro Fortran kombinerar den första fullständiga ANSI standard Fortran 90 kompilatorn för Power Macintosh, den senaste PPC versionen (4.4) av Absoft's bästsäljande VAX-kompatibla FORTRAN 77-kompilator, och Absoft's PPC C & C++ kompilatorer i ett enda lättanvänt utvecklingssystem. Det möjliggör utveckling av ny kod med de nya egenskaperna och flexibiliteten hos Fortran 90, effektivt utnyttjande av uttestad FORTRAN 77 kod, och blandad F90/F77/C/C++ utveckling i en enda miljö. Ett gemensamt "runtime" bibliotek och en modifierad länkare ger full kompatibilitet mellan språken, så man kan utnyttja F90, F77 och C/C++ kod i samma tillämpning. Pro Fortran genererar äkta PPC kod.

A 7.5.2 Kompilering med Absoft Fortran 90

För att kompilera källkoden kod1.f90 i den nya fria formen skriver man:

        f90 kod1.f90 -o program_namn

För att kompilera källkoden kod2.f i den gamla fixa formen skriver man:
        f90 kod2.f -o program_namn

Nedan följer de viktigaste tilläggen till kompileringskommandot hos Absoft Fortran 90 kompilator.
   -604         #   Optimera för PPC 604
   -c           #   Generera enbart objektfiler
   -dB          #   Utför enbart syntaxkontroll av källkoden
   -dp          #   Konvertera DOUBLE PRECISION till REAL
   -dq          #   Fortsätt kompileringen även efter 100 fel
   -ea          #   Avbryt kompileringen vid första felet
   -ej          #   En DO slinga utföres alltid minst en gång
			(falsk F66 kompatibilitet)
   -en          #   Ge varning för alla standard-avvikelser
   -eR          #   Rekursion
   -F           #   Använd filer för tillfällig lagring
   -f fixed     #   Använd källkod i fix form
   -f free      #   Använd källkod i fri form
   -g           #   Generera avlusningsinformation
   -gmin        #   Generera ett minimum av avlusningsinformation
   -I path      #   Definiera sökvägen att innehålla inkluderingsfiler
   -link <arg>  #   Överför direkt till länkaren
   -macModFiles #   Sök efter filer med  moduler
   -N9          #   "Frequent Command-period checks"
   -N11         #   Använd 32-bits förgrening
   -N124        #   "Traceback", skriver rutinnamn på "stdout"
   -O           #   Grundläggande optimering
   -o file      #   Ange ut-filens namn
   -p file      #   Ange modulens filnamn
   -p dir       #   Ange filkatalog för modul-filer
   -prof        #   Addera kod för profilering (enbart PPC)
   -plainappl   #   Skapa tillämpningar utan "MRWE"
   -s           #   Tvinga all lagring att vara statisk
   -share       #   Länka med delad version av "runtime" biblioteket
   -tool        #   Skapa ett "MPW Tool" i stället för en tillämpning
   -V           #   Visa kompilatorns versionsinformation
   -v           #   Visa hur kompileringen framskrider
   -W80         #   Tillåt källkod med upp till 80 kolumner
   -W132        #   Tillåt källkod med upp till 132 kolumner
   -w           #   Undertryck kompilatorvarningar
   -Z number    #   Undertryck varning nummer
   -z number    #   Sätt varningsnivå

A 7.5.3 Systemparametrar

Systemparametrarna på PowerPC, utnyttjande Fortran 90 kompilatorn från Absoft ges här. Jämför med NAG tabellen.

Se även de numeriska förfrågningsfunktionerna i Appendix 5.8.

LOGICAL              Default
 KIND number =             4
 
INTEGER              Default  INTEGER(1)  INTEGER(2)  INTEGER(4)
 KIND number =             4           1           2           4
      digits =            31           7          15          31
       radix =             2           2           2           2
       range =             9           2           4           9
        huge =    2147483647         127       32767  2147483647
    bit_size =            32           8          16          32
 
REAL                     Default                    REAL(8)
  KIND number =                4                          8
       digits =               24                         53
  maxexponent =              128                       1024
  minexponent =             -125                      -1021
    precision =                6                         15
        radix =                2                          2
        range =               37                        307
      epsilon =     1.192093E-07     2.220446049250313E-016
         tiny =     1.175494E-38     2.225073858507202E-308
         huge =     3.402823E+38     1.797693134862314E+308
  
COMPLEX             Default      COMPLEX(8)         
  KIND number =           4               8
    precision =           6              15
        range =          37             307

A 7.6 Fortran 90 på Solaris

A 7.6.1 Performance Workshop for Fortran 95

Sun ONE Studio 7, Compiler Collection är den första i en familj produkter avsedda för dem som utvecklar produkter inom området högpresterande datorsystem. Inkluderar en Fortran 90 kompilator och ett matematiskt bibliotek optimerat för SPARC plattformen.

A 7.6.2 Systemparametrar på Solaris

Systemparametrarna på Solaris, utnyttjande SunSoft Fortran 90 kompilatorn ges här. Jämför motsvarande tabell för NAG, Digital, Cray T3E eller Cray C90.

Sun, Digital, och Cray använder alla antalet bytes som KIND-parameter. SunSoft tillåter värdena 1, 4 och 8 för logiska variabler (med samma resultat som för skönsvärdet 4), värdena 1, 2 och 4 för heltal, värdena 4 och 8 för flyttal, och likaså värdena 4 och 8 för komplexa tal. Namnen int7, int15, och int31 är mina egna.

  
LOGICAL              Default      byte      word     double
  KIND number =            4         1         4          8

INTEGER                   int7          int15         int31
  KIND number =              1              2             4
       digits =              7             15            31
        radix =              2              2             2
        range =              2              4             9
         huge =            127          32767    2147483647
     bit_size =              8             16            32

REAL                      single          double
  KIND number =                4               8
       digits =               24              53
  maxexponent =              128            1024
  minexponent =             -125           -1021
    precision =                6              15
        radix =                2               2
        range =               37             307
      epsilon =   0.11920929E-06  0.22204460E-15
         tiny =   0.11754944E-37  0.22250739-307
         huge =   0.34028235E+39  0.17976931+309

COMPLEX                  single           double
  KIND number =               4                8
    precision =               6               15
        range =              37              307

A 7.6.3 Kompilering på Solaris

Jag listar här de viktigaste tilläggen till kompileringskommandot. Den fullständiga listan erhålles med kommandot f90 -flags eller man f90.
-ansi          Rapportera utvidgningar från ANSI Fortran 90
-C             Indexkontroll
-c             Enbart kompilering (ej länkning)
-e             Acceptera långa (132 tecken) källkodsrader
-fast          Specificera ett vanlig kombination av 
               prestanda-villkor
-fixed         Tolka alla Fortran källkodsfiler som
	       fix form
-flags         Skriv ut en sammanfattning av kompilerings-
               tilläggen (fullständig version av 
               denna lista)
-fnonstd       Icke-standard initiering av flyttalshårdvaran
-fns           Slå på icke-standard flyttalsaritmetik
-free          Tolka alla Fortran källkodsfiler som
               fri form
-fround	       Välj IEEE avrundningsmod
-g             Generera avlusningsinformation för dbx
-help          Samma som -flags
-IX            Adderar katalogen X till sökvägen 
               för inkluderingsfiler
-LX            Adderar katalogen X till sökvägen 
               för bibliotek
-lX            Använd objektbiblioteket X
-MX            Adderar katalogen X till sökvägen 
               för moduler
-o file        Sätt namn på resultatfilen
-O             Generera optimerad kod
-onetrip       Utför DO-slingor minst en gång
	       (falsk Fortran 66-tolkning)
-p             Förbered objektkoden att samla data för 
               profilering med prof
-pg            Förbered objektkoden att samla data för 
               profilering med gprof
-qp            Samma som -p

	Producera filer av nedanstående typ 
        (kan även stavas -qproduce)

-Qproduce .f90      .f90  (f90 källkod, Fri Form)
-Qproduce .f        .f    (f90 källkod, Fix Form)
-Qproduce .lst      .lst  (f90 listning)
-Qproduce .o        .o    (Objektfil)
-Qproduce .s        .s    (Assemblerkod)

-r8const       Ändrar alla enkelprecisionskonstanter till
               dubbelprecisionskonstanter
-S             Producera enbart en .s fil
-s             "Strip the executable"
-time          Rapportera exekveringstiden för varje komponent
-u             Medför IMPLICIT NONE
-V             Visa versionsnummer för varje komponent
-v             "Verbose mode", dvs många kommentarer 
               från systemet
-w             Undertryck varningar
-xtypemap      Val av precision för heltal och flyttal
Följande filtyper kan användas:
  .a      Objektbibliotek
  .il     "Inline" fil
  .o      Objektfil
  .so     Delat objekt
  .s      Assemblerkod
  .S      Assemblerkod för cpp
  .for    f90 källkod (Fix Form)
  .ftn    f90 källkod (Fix Form)
  .f      f90 källkod (Fix Form)
  .F      ej för närvarande igenkänd
  .f90    f90 källkod (Fri Form)
  .lst    f90 listning

A 7.6.4 Några exempel på Solaris

Vi har några exempel för Digital Unix, vilka vi nu även kört på Sun Solaris systemet. Det är avrundningskonstants-programmet EPSILON från sektion 1 och ett summationsexempel.

Hos Digital finns det några enkla kommandon för att informera kompilatorn (vid kompileringstillfället) om vilken precision som önskas. Detta sker på Sun med kommandot -xtypemap, och följande kombinationer är tillåtna:

-xtypemap=real:32,double:64                       Default
-xtypemap=real:64,double:64                       Båda lika
-xtypemap=real:64,double:128                      Båda dubblade
Även för heltalen finns två alternativ, integer:32 eller integer:64. Notera att endast variabler specificerade med REAL :: VAR påverkas, inte de specificerade med REAL (KIND=ngt) :: VAR, och med motsvarande regel för heltalen. Det är inte möjligt att använda real:128 eller double:32.

Vi tittar först på programmet EPSILON. För att få önskad precision använder vi SELECTED_REAL_KIND.

Skript startat onsdag 6 juni 2001, använder Solaris 8 på datorn water.

water[~]> cat epsilon2.f90
            PROGRAM EPSILON2
!           Detta program är avsiktligt felaktigt om det inte
!           kompileras med Sun's väljare "-r8const"
            IMPLICIT NONE
            INTEGER, PARAMETER :: DP = SELECTED_REAL_KIND(15,307)
            REAL (KIND=DP) :: 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 EPSILON2
Om detta program kompileras på vanligt sätt blir resultatet motsvarande enkel precision, om det kompileras med -r8const blir resultatet däremot motsvarande dubbel precision.
water[~]> f95 epsilon2.f90
water[~]> ./a.out
  my =  5.960464477539062E-8          ! Resultat i enkel precision
water[~]> f95 -r8const epsilon2.f90
water[~]> ./a.out
  my =  1.1102230246251565E-16        ! Resultat i dubbel precision
water[~]>
Vi försöker nu med fyrdubbel precision. Här finns ingen motsvarighet till -r8const eller -r16const, så alla flyttalskonstanter måste specificeras explicit att vara av korrekt precision. I exemplet nedan räcker det dock att fullständigt specificera tredjedelen som tilldelas tiil A, eftersom de andra konstanterna alla är exakta i binär aritmetik.
water[~]> cat epsilon4.f90
            PROGRAM EPSILON4
            IMPLICIT NONE
            INTEGER, PARAMETER :: QP = SELECTED_REAL_KIND(33,3000)
            REAL (KIND=QP) :: A, B, C, D, E

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

            E = ABS(D)

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

            END PROGRAM EPSILON4
water[~]> f95 epsilon4.f90
water[~]> ./a.out
  my =  9.629649721936179265279889712924637E-35
! Resultat i fyrdubbel precision
water[~]> exit
Resultat blir helt korrekt, vi kan notera att 33 är det maximala antalet signifikanta siffror på detta system.

Summationsprogrammet SUMMA med tre precisioner på en gång uppvisar bara en obetydlig skillnad mot på Digitals system, nämligen att den högsta precisionen skrevs ut med ytterligare två siffror. Konsistent resultat från de båda systemen.

A 7.7 SGI 3000

A 7.7.1 Kompilering på SGI 3000 med Fortran 90.

Nuvarande kompilator är MIPSpro Compiler Version 7.3.1.3m. Kompilatoralternativ erhålles med man f90. Du kompilerar med f90, om du använder f90 -r8 blir enkel precision omvandlad till dubbel, och om du använder f90 -d16 blir dubbel precision omvandlad till fyrdubbel (quad) precision. Det är möjligt att kombinera till f90 -r8 -d16.

A 7.7.2 Systemparametrar på SGI 3000 under Fortran 90.

Systemparametrarna för SGI 3000 under SGI Fortran 90 kompilator ges nedan. Notera att SGI använder antalet bytes som KIND värde. Beteckningarna halfword, quad, int15, int31, och int63 är mina egna.

Jämför med Cray C90 tabellen, Cray T3E tabellen, Digital Alfa tabellen, och NAG tabellen.

INTEGER                     default
 KIND number =                    4
      digits =                   31
       radix =                    2
       range =                    9
        huge =           2147483647
    bit_size =                   32
  
INTEGER                  int15          int31               int63
 KIND number =               2              4                   8
      digits =              15             31                  63
       radix =               2              2                   2
       range =               4              9                  18
        huge =           32767     2147483647 9223372036854775807
    bit_size =              16             32                  64
  
LOGICAL              default        byte    halfword        word      double
  KIND number =            4           1           2           4           8


REAL                      single          double            quad         default
  KIND number =                4               8              16               4
       digits =               24              53             107              24
  maxexponent =              128            1024            1023             128
  minexponent =             -125           -1021            -915            -125
    precision =                6              15              31               6
        radix =                2               2               2               2
        range =               37             307             275              37
      epsilon =   0.11920929E-06  0.22204460E-15  0.12325952E-31  0.11920929E-06
         tiny =   0.11754944E-37  0.22250739-307  0.18051944-275  0.11754944E-37
         huge =   0.34028235E+39  0.17976931+309  0.89884657+308  0.34028235E+39
  
COMPLEX                   single          double            quad
  KIND number =                4               8              16
    precision =                6              15              31
        range =               37             307             275
OBS! Enligt SGI:s man models skall värdet av minexponent i quad-precision vara -967 i stället för det erhållna -915.

Det lilla omfånget för exponenten i quad-precision är förvånande! När jag använder metoderna från den elementära kursen i Numeriska Metoder, utnyttjar Fortran 90 men undviker de inbyggda funktionerna, får jag att parametrarna maxexponent, minexponent och range förefaller bli samma i quad-precision som i dubbel precision. Motsvarande variabler får dock ej full quad-precision utanför de ovan givna parametrarna, varför tabellen ovan är korrekt.

SGI har en helt annan quad-precision än vad Digital Alfa har. Den senare har ett väldigt stort omfång. Orsaken är att hos SGI representeras quad-variabler som summan eller skillnaden av två tal i dubbel precision, normaliserade så att det mindre är <= 0.5 enheter i sista postionen av det större.

NAG:s Fortran 90/95 Innehåll Fortrans utveckling


Senast modifierad: 20 mars 2006
boein@nsc.liu.se