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.
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 2465Jag 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 segldrDet 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.
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
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
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
Mina tester tyder på att den följer IEEE 754 korrekt (enkel och dubbel precision, högre precision är ännu ej standardiserad).
% 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 %
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.f90men 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.f90att 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.f90sker samtliga beräkningar i fyrdubbel precision.
Absoft Corporation 2781 Bond Street Rochester Hills, MI 48309 USA sales@absoft.com Tel: +1 (248) 853 0050 Fax: +1 (248) 853 0108Pro 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.
För att kompilera källkoden kod1.f90 i den nya fria formen skriver man:
f90 kod1.f90 -o program_namnFör att kompilera källkoden kod2.f i den gamla fixa formen skriver man:
f90 kod2.f -o program_namnNedan 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å
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
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.
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
-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 flyttalFö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
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 EPSILON2Om 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[~]> exitResultat 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.
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 275OBS! 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.