Recentemente ho riscontrato un problema bizzarro con FORTRAN95. Ho inizializzato le variabili X e Y come segue:
X=1.0 Y=0.1
Successivamente le aggiungo e stampo il risultato:
1.10000000149012
Dopo aver esaminato le variabili, sembra che 0.1 non sia rappresentato in doppia precisione con la massima accuratezza. Cè un modo per evitarlo?
Answer
Un altro modo per farlo è specificare prima in modo esplicito la precisione che desideri nella variabile utilizzando lintrinseco SELECTED_REAL_KIND e quindi utilizzarlo per definire e inizializzare le variabili. :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
Un bel vantaggio di farlo in questo modo è che puoi memorizzare la definizione di dp
in un modulo, quindi USE
quel modulo dove necessario. Ora, se vuoi cambiare la precisione del tuo programma, devi solo modificare la definizione di dp
in quellunica posizione invece di cercare e sostituire tutti i D0
nella fine delle inizializzazioni delle variabili. (Questo è anche il motivo per cui “consiglio di non utilizzare la sintassi 1.0D-1
per definire Y come suggerito. Funziona, ma rende più difficile trovare e modificare tutte le istanze in futuro.)
Questa pagina sul Wiki di Fortran fornisce alcune buone informazioni aggiuntive su SELECTED_REAL_KIND
.
Commenti
Risposta
Hai dichiarato le variabili come doppia precisione, ma le hai inizializzate con valori a precisione singola.
Avresti potuto scrivere:
X=1.0d0 Y=1.0d-1
Barron “s risposta di seguito è un altro modo per creare una doppia precisione letterale, con il vantaggio che consente di modificare la precisione delle variabili in un secondo momento.
Commenti
- Penso che si dovrebbe utilizzare il metodo 1.0_dp descritto nel post di seguito.
- Secondo @ OndřejČert í k ' s commento – La risposta di Barron ' è la migliore.
_dp
è che la precisione è chiaramente definita in modo portatile.