2013-03-28 11 views
9

Sto attraversando un periodo di difficoltà con le dichiarazioni di formattazione in Fortran.Fortran dimezza il risultato in asterischi: perché?

senza formattare la mia uscita, questo è quello che faccio (all'interno di un ciclo, quindi questo accade un paio di volte):

write(*,*) t*1E9 

t qui è real*8. L'uscita è proprio quello che mi aspettavo - incrementi di 0,1, con alcuni errori di arrotondamento:

0.0000000000000000  
0.10000000000000001  
0.20000000000000001  
0.29999999999999999  
0.40000000000000002  
0.50000000000000000  
0.59999999999999998  
0.69999999999999996  
0.79999999999999993  
0.89999999999999991  
0.99999999999999989 

Ora, provo ad aggiungere un'istruzione di formato:

write(*, '(F1.2)') t*1E9 

e (con tutto il resto lo stesso) invece ho solo asterischi nella mia uscita:

** 
** 
(etc...) 

ho cercato di leggere su come questo dovrebbe funzionare, e non riesco a capire perché questo sta accadendo. Ho provato i formati con più spazio per le cifre (F15.15 mi dà solo più asterischi per riga), ho provato a spostare l'istruzione di formato sulla propria riga etichettata ... Non riesco a ottenere l'output I ' mi piace

Cosa mi manca qui?

risposta

15

dichiarazioni formato Fortran sono definiti come:

Fw.d, dove w è il numero di caratteri da utilizzare in totale, e d è il numero di caratteri dopo il punto decimale. Qui stai dicendo che hai bisogno di un float, cioè 1 carattere di larghezza in totale, e 2 caratteri dopo il punto decimale, qualcosa che ovviamente non è corretto. Quindi, per ottenere, ad esempio, un galleggiante che si trova a 4 caratteri in totale, con 3 cifre decimali, devi scrivere:

write(*, '(F4.3)') t*1E9 

Vedi http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap05/format.html

Inoltre, devo dire che gli asterischi sono indicativi che il numero non può essere visualizzato nel formato indicato.

EDIT:

Aggiunta nel commento da george di seguito:

"Per il formato E il fieldwidth deve essere più di almeno 7 rispetto al numero di cifre decimali, ad esempio E15.8 Quattro per l'esponente. , due per il lead 0. uno per un possibile '-'. Di solito aggiungo uno spazio in più in modo che i numeri non corrano insieme, E16.8 "

+0

Grazie! Questo spiega molto =) Tuttavia, non mi aiuta fino in fondo - quando applico gli stessi principi, sebbene con es. 'E5.4', per altri doppi (es.' Real * 8's), una colonna con ordine di magnitudine 1e-2 - 1e-3 e una con ordine di magnitudine 1e2, fornisce med asterischi per quelle colonne (il tempo la colonna funziona come previsto). La mia intera stringa di formato al momento: 'F4.2, E10.8, E10.8'. –

+4

Per il formato E l'ampiezza di campo deve essere almeno 7 in più del numero di decimali, ad es. E15.8. Quattro per l'esponente, due per il primo 0. uno per un possibile '-'. Di solito aggiungo un altro spazio in più in modo che i numeri non corrano insieme, E16.8 .. – agentp

+0

Questo lo spiega - grazie! –