mboost-dp1

Fortran tilbage i TIOBE top 10


Gå til bund
Gravatar #1 - arne_v
15. maj 2024 13:12
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.
Gravatar #2 - larsp
16. maj 2024 07:05
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.
Gravatar #3 - arne_v
16. maj 2024 13:25
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):


______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






Gravatar #4 - arne_v
16. maj 2024 13:32
#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.
Gravatar #5 - arne_v
17. maj 2024 18:47
Simpelt fortran som demonsterer havd det kan:


C:\Work\Fortran>type math.for
program math
write(*,*) exp(pi*sqrt((-1,0)))-1
end

C:\Work\Fortran>gfortran math.for -o math.exe

C:\Work\Fortran>math
(0.00000000,3.797518838E-43)
Gravatar #6 - arne_v
20. maj 2024 01:46
Og noget nyt, Fortran & Web Assembly:

https://gws.phd/posts/fortran_wasm/
Gravatar #7 - larsp
21. maj 2024 05:55
#5, den kræver lidt forklaring. Hvis jeg slår komplekse tal i min regnemaskine får jeg svaret:

exp(pi*sqrt(-1))-1
= -2

Hvad betyder write(*,*) ?
Gravatar #8 - larsp
21. maj 2024 06:03
#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.
Gravatar #9 - arne_v
21. maj 2024 14:15
#7

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.

Gravatar #10 - arne_v
21. maj 2024 14:22
#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'
Gravatar #11 - arne_v
21. maj 2024 16:53
#9

En anden måde at hente pi:


program math2
write(*,*) exp(4*atan(1.0)*sqrt((-1,0)))+1
end
Gravatar #12 - arne_v
21. maj 2024 17:20
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).
Gravatar #13 - larsp
22. maj 2024 07:56
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


Gravatar #14 - arne_v
22. maj 2024 12:51
#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:


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)

Gravatar #15 - arne_v
22. maj 2024 13:15
#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.
Gå til top

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.

Opret Bruger Login