mboost-dp1
Fortran tilbage i TIOBE top 10
- Forside
- ⟨
- Forum
- ⟨
- Tagwall
https://www.techrepublic.com/article/tiobe-index-m...
TIOBE er ikke et perfekt billede af hvad folk bruger, men en høj placering er et tegn på at der er en eller anden form for interesse.
TIOBE er ikke et perfekt billede af hvad folk bruger, men en høj placering er et tegn på at der er en eller anden form for interesse.
The venerable language is “fast, having native mathematical computation support, mature, and free of charge,” Jansen said.
Fortran er ikke min kop te, men jeg kan godt se pointen. Det er næsten lidt pinligt at der ikke er et let tilgængeligt, moderne sprog der kan træde til her.
På nogen måder er Fortran's alder lidt misvisende.
Ja - man kan sige:
Fortran 1957
...
C++ 1985
Python 1991
Java 1995
PHP 1995
C# 2002
Men man kan også sige at vi har 2 sprog:
- FORTRAN med versioner I, II, III, IV/66, V/77
- Fortran med versioner 90, 95, 2003, 2008, 2018, 2023
hvor en Fortran compiler kan oversætte FORTRAN kode.
Og det giver en timeline:
FORTRAN 1957
...
C++ 1985
Fortran 1991
Python 1991
Java 1995
PHP 1995
C# 2002
og så er Fortran ikke ældre end mange andre sprog.
Måske lidt søgt men der er meget stor forskel på Fortran 77 og 90.
Fortran 77 (oversætter fint med Fortran 90 compiler):
Fortran 90:
Ja - man kan sige:
Fortran 1957
...
C++ 1985
Python 1991
Java 1995
PHP 1995
C# 2002
Men man kan også sige at vi har 2 sprog:
- FORTRAN med versioner I, II, III, IV/66, V/77
- Fortran med versioner 90, 95, 2003, 2008, 2018, 2023
hvor en Fortran compiler kan oversætte FORTRAN kode.
Og det giver en timeline:
FORTRAN 1957
...
C++ 1985
Fortran 1991
Python 1991
Java 1995
PHP 1995
C# 2002
og så er Fortran ikke ældre end mange andre sprog.
Måske lidt søgt men der er meget stor forskel på Fortran 77 og 90.
Fortran 77 (oversætter fint med Fortran 90 compiler):
______program p77
______integer*4 i
______do 100 i = 1, 3
________write(*,*) i
100 continue
______end
Fortran 90:
program p90
____integer(kind=4)::i
____do i = 1, 3
______write(*,*) i
____end do
end program
#2
Men ja det har været lidt magert med hensyn til mulige Fortran afløsere.
C mangler en del i det numeriske og har multi-dimensional array inkompabilitets problem med Fortran.
C++ kan alt med custom klasser og operator overload, men det ender hurtigt med at alle banale sætninger resulterer i en håndfuld metodekald.
Sun forsøgte med et sprog Fortress (JVM baseret). Men det slog aldrig igennem.
Lige nu er bedste bud nok Julia.
Personligt bruger jeg nogen gange Kotlin til den slags kode, men det er samme problem som C++ - der sker en masse under overfladen.
Men ja det har været lidt magert med hensyn til mulige Fortran afløsere.
C mangler en del i det numeriske og har multi-dimensional array inkompabilitets problem med Fortran.
C++ kan alt med custom klasser og operator overload, men det ender hurtigt med at alle banale sætninger resulterer i en håndfuld metodekald.
Sun forsøgte med et sprog Fortress (JVM baseret). Men det slog aldrig igennem.
Lige nu er bedste bud nok Julia.
Personligt bruger jeg nogen gange Kotlin til den slags kode, men det er samme problem som C++ - der sker en masse under overfladen.
#4 Ja, C er bestemt ikke egnet. På universitetet brugte vi matlab til matematiske beregninger og mens det havde et imponerende library af funktioner, var selve syntaksen godt nok ikke særlig køn. Og det er jo et scripting sprog, som nok bedre kan sammenlignes med Python.
C++ kunne vel godt løfte opgaven med de rette libraries, at være et kompileret, høj-performance sprog med support for avanceret matematik.
C++ kunne vel godt løfte opgaven med de rette libraries, at være et kompileret, høj-performance sprog med support for avanceret matematik.
#7
Der var fejl i koden - faktisk hele to fejl i koden.
:-( :-( :-(
Her er den korrekte version:
PI skal erklæres - det er ikke en kendt konstant. En af de farlige egenskaber ved fortran er at man ikke behøver at erklære variable.
Og det er +1 ikke -1. Hvilket jeg ikke opdagede, da programmet p.g.a. den første fejl gav det forventede resultat.
Der var fejl i koden - faktisk hele to fejl i koden.
:-( :-( :-(
Her er den korrekte version:
C:\Work>type math.for
program math
real,parameter::pi = 3.141592653589793238
write(*,*) exp(pi*sqrt((-1,0)))+1
end
C:\Work>gfortran math.for -o math.exe
C:\Work>math
(0.00000000,-8.742277657E-08)
PI skal erklæres - det er ikke en kendt konstant. En af de farlige egenskaber ved fortran er at man ikke behøver at erklære variable.
Og det er +1 ikke -1. Hvilket jeg ikke opdagede, da programmet p.g.a. den første fejl gav det forventede resultat.
#5
write(*,*) noget
i Fortran svarer til hvad der i de fleste andre sprog er:
print(noget)
Det første argument er hvilken fil man vil skrive til - * betyder stdout.
Det andet argument er formatet for output (tænk printf) - * betyder "find selv et passende format"
C:
fprintf(f1, "%4d %s\n", 123, "ABC");
i Fortran:
write(1,'(1x,I4,1x,A)') 123, 'ABC'
write(*,*) noget
i Fortran svarer til hvad der i de fleste andre sprog er:
print(noget)
Det første argument er hvilken fil man vil skrive til - * betyder stdout.
Det andet argument er formatet for output (tænk printf) - * betyder "find selv et passende format"
C:
fprintf(f1, "%4d %s\n", 123, "ABC");
i Fortran:
write(1,'(1x,I4,1x,A)') 123, 'ABC'
larsp (8) skrev:
C++ kunne vel godt løfte opgaven med de rette libraries, at være et kompileret, høj-performance sprog med support for avanceret matematik.
Ja.
Man kan lave Vector og Matrix klasser med operator overload som gør at man næsten kan bruge matematiske formler direkte.
Jeg *gjorde* det for 35 år siden. Større skriftlig opgave omkring brug af OOP C++ som økonometrisk værktøj. Jeg synes stadig at det var rigtigt godt. Censor var ikke imponeret og jeg fik kun en middelmådig karakter.
Men:
arne_v (4) skrev:
C++ kan alt med custom klasser og operator overload, men det ender hurtigt med at alle banale sætninger resulterer i en håndfuld metodekald.
Et eksempel fra 35 år siden:
mx a(2,2,2.0),b(2,2),c(2,2,"ex_mx.dat"),d;
...
d = inv(2*a+b+tran(c));
Det er et simpelt udtryk med multiplikation, addition, transponering og invertering.
Lige ud af landevejen fra et matematisk synspunkt.
Men programmeringsmæssigt er der:
* 3 input matricer
* 1 output matrice
* 5 (!!!!) temporære matricer
* et stort antal metodekald
Man skjuler kompleksiteten.
Hvis det var Python ville man sige "selvfølgelig". Men jeg ved ikke med C++.
PS: Apropos emnet, så brugte den C++ kode faktisk nogle low level Fortran rutiner - ikke strengt nødvendigt, men de eksisterede og kom med loop unrolling (g++ lavede ikke automatisk loop unrolling dengang som man kan idag med -funroll-loops).
arne_v (9) skrev:Her er den korrekte version:
C:\Work>type math.for
program math
real,parameter::pi = 3.141592653589793238
write(*,*) exp(pi*sqrt((-1,0)))+1
end
C:\Work>gfortran math.for -o math.exe
C:\Work>math
(0.00000000,-8.742277657E-08)
Aha, det er en test for unøjagtighed efter en tur gennem diverse komplekse funktioner.
Speedcrunch: (min go-to regnemaskine desktop app, kan anbefales!) giver rent 0 selvom jeg beder om 50 decimaler:
exp(pi*sqrt((-1)))+1
= 0
Python:
>>> import cmath
>>> cmath.exp(cmath.pi * cmath.sqrt(complex(-1, 0))) + 1
1.2246467991473532e-16j
Dit pogram kørt på min Linux maskine:
$ ./math
(0.00000000,-8.742277657E-08)
$ gfortran --version
GNU Fortran (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
TI-83 (emuleret med wabbitemu på min Android, kan anbefales! i stedet for crappy spyware-fyldte calculator programmer)
Giver et rent nul: 0
#13
Det er simpelthen et spørgsmål om hvilken FP der bruges.
Fortran defaulter til single precision.
Python bruger tilsyneladende double precision.
Illustrativt Fortran eksempel:
Det er simpelthen et spørgsmål om hvilken FP der bruges.
Fortran defaulter til single precision.
Python bruger tilsyneladende double precision.
Illustrativt Fortran eksempel:
C:\Work\Fortran>type mathx.for
program math
call testf
call testd
call testq
end
c
subroutine testf
real*4,parameter::pi = 3.14159265
write(*,*) exp(pi*sqrt((-1,0)))+1
end
c
subroutine testd
real*8,parameter::pi = 3.141592653589793238d0
write(*,*) exp(pi*sqrt((-1d0,0d0)))+1d0
end
c
subroutine testq
real*16,parameter::pi = 3.141592653589793238462643383279502884q0
write(*,*) exp(pi*sqrt((-1q0,0q0)))+1q0
end
C:\Work\Fortran>gfortran mathx.for -o mathx.exe
C:\Work\Fortran>mathx
(0.00000000,-8.742277657E-08)
(0.0000000000000000,1.22464679914735321E-016)
(0.00000000000000000000000000000000000,8.671810130123781024797044026043352254E-0035)
#13
Lommeregnerne bruger sikkert et meget præcist format internt.
De opererer typisk kun på et enkelt tal. Så performance betyder ikke noget.
Fortran programmer opererer typisk på vektorer eller matricer.
Mange matrix operationer er O(n^3). Med store matricer giver det rigtigt mange beregninger.
Grunden til at super computere idag måles i hundreder af PetaFlops (units af 10^15 flops).
I parentes bemærket måles super computer flops med LINPACK Fortran kode i double precision.
Lommeregnerne bruger sikkert et meget præcist format internt.
De opererer typisk kun på et enkelt tal. Så performance betyder ikke noget.
Fortran programmer opererer typisk på vektorer eller matricer.
Mange matrix operationer er O(n^3). Med store matricer giver det rigtigt mange beregninger.
Grunden til at super computere idag måles i hundreder af PetaFlops (units af 10^15 flops).
I parentes bemærket måles super computer flops med LINPACK Fortran kode i double precision.
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.