Come impostare valori di doppia precisione in Fortran


10

Di recente, ho riscontrato un bizzarro problema con FORTRAN95. Ho inizializzato le variabili X e Y come segue:

X=1.0
Y=0.1

Più tardi li aggiungo insieme 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?

Risposte:


21

Un altro modo per eseguire questa operazione è innanzitutto specificare esplicitamente la precisione desiderata nella variabile utilizzando intrinseco SELECTED_REAL_KIND, quindi utilizzarlo per definire e inizializzare le variabili. Qualcosa di simile a:

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15)
REAL(dp) :: x
x = 1.0_dp

Un bel vantaggio nel farlo in questo modo è che puoi memorizzare la definizione di dpin un modulo, quindi USEquel modulo dove necessario. Ora, se mai vuoi cambiare la precisione del tuo programma, devi solo cambiare la definizione dpin quel posto invece di cercare e sostituire tutti i messaggi di posta D0elettronica alla fine delle tue inizializzazioni variabili. (Questo è anche il motivo per cui consiglierei di non usare la 1.0D-1sintassi per definire Y come suggerito. Funziona, ma rende più difficile trovare e modificare tutte le istanze in futuro.)

Questa pagina sul Wiki Fortran fornisce alcune buone informazioni aggiuntive su SELECTED_REAL_KIND.


Esatto, questo dovrebbe essere l'approccio standard.
Ondřej Čertík,

E quanto spesso le persone devono davvero cambiare la precisione dei loro programmi alla cieca senza passare comunque dalla procedura alla procedura e dai test? Il motivo principale per utilizzare lo _dpschema è che la precisione sia chiaramente definita in modo portatile.
Ja72,

12

Hai dichiarato le variabili come doppia precisione, ma le hai inizializzate con valori di precisione singoli.

Avresti potuto scrivere:

X=1.0d0
Y=1.0d-1

La risposta di Barron di seguito è un altro modo di creare una doppia precisione letterale, con il vantaggio che ti consente di modificare la precisione delle tue variabili in un secondo momento.


1
Penso che si dovrebbe usare il metodo 1.0_dp descritto nel post seguente.
Ondřej Čertík,

1
Secondo il commento di OndřejČertík: la risposta di Barron è la migliore.
OscarB,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.