Sommatoria in fortran
salve ragazzi, sono un neofita di fortran e non capisco perchè il seguente codice nonostante compli e mi calcoli Q_fin e Q_in pone Q=0. Cioè legge l inizializzazione fuori dal ciclo do e rimane tale. please help
program readwrite
implicit none
real a(200,4),Q_in,Q_fin,Q,Q_tot,v_med
integer i,j,nj
character*40 nome
write(6,*) 'nome file'
read(5,'(a)') nome
open(unit=16,file=nome)
nj=180
do i=1,nj
read(16,*) (a(i,j),j=1,4)
enddo
Q_in=(a(1,1)-a(1,3))/2*a(1,2)
Q_fin=(2-a(180,1))/2*a(180,2)
Q=0.
do i=1,nj-1
Q=Q+1/2*((a(i+1,2)+a(i,2))*(a(i+1,1)-a(i,1)))
enddo
Q_tot=Q+Q_in+Q_fin
v_med=Q_tot/2
write(6,*) 'velocita media', v_med
write(6,*) 'Q', Q
write(6,*) 'Q_in', Q_in
write(6,*) 'Q_fin', Q_fin
end
Risposte
Benvenuto al forum e buona permanenza; visto che è il tuo primo messaggio, te lo sposto io nella sezione adatta (informatica), per le prossime volte ti invito a dare un'occhiata al regolamento e a postare nella sezione corretta.
[ot]Fortran O.o
Nel 2018? Ma che scherziamo?[/ot]
Nel 2018? Ma che scherziamo?[/ot]
Non sono un esperto di Fortran ma la mia ipotesi è che questa espressione possa essere valutata a zero:
Se il calcolo venisse in effetti fatto valutando prima \(1/2\) come numeri interi e poi facendo la moltiplicazione avresti uno zero. Ti consiglio di usare \(0.5\) se vuoi moltiplicare per un mezzo o inserire delle parentesi se vuoi fare qualcosa di diverso.
@feddy: Anche se non è certamente tra i linguaggi più comuni, ci sono ancora diversi settori in cui Fortran viene usato (HPC principalmente) e ha subito diversi miglioramenti negli anni (l'ultimo standard è del 2010).
1/2*((a(i+1,2)+a(i,2))*(a(i+1,1)-a(i,1)))
Se il calcolo venisse in effetti fatto valutando prima \(1/2\) come numeri interi e poi facendo la moltiplicazione avresti uno zero. Ti consiglio di usare \(0.5\) se vuoi moltiplicare per un mezzo o inserire delle parentesi se vuoi fare qualcosa di diverso.
@feddy: Anche se non è certamente tra i linguaggi più comuni, ci sono ancora diversi settori in cui Fortran viene usato (HPC principalmente) e ha subito diversi miglioramenti negli anni (l'ultimo standard è del 2010).