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

  • ' è giusto, questo dovrebbe essere lapproccio standard.
  • E quante volte le persone devono davvero cambiare la precisione dei loro programmi alla cieca senza passare comunque procedura per procedura e testare? Il motivo principale per utilizzare lo schema _dp è che la precisione è chiaramente definita in modo portatile.

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *