2013-05-10 15 views
5

Say Ho il seguente programma:migliorare la precisione sulle variabili definite dal numero intero quoziente

program derp 
    implicit none 
    integer, parameter :: ikind = selected_real_kind(18) 
    real (kind = ikind) :: a = 2.0/3.0 
    print*, a 
end program derp 

Il programma derp uscite 0.6666666865348815917, che evidentemente non è 18 cifre di precisione. Tuttavia, se definisco a=2.0 e b=3.0 utilizzando lo stesso metodo e quindi definisco c=a/b ottengo un'uscita di 0.666666666666666666685, che è buona. Come faccio a definire una variabile come un quoziente di numeri interi e devo memorizzare tutte le cifre di precisione che voglio da selected_real_kind?

risposta

8

Prova: real (kind = ikind) :: a = 2.0_ikind/3.0_ikind

La ragione è, mentre il LHS è alta precisione, il RHS nel tuo esempio di codice, 2.0/3.0, non lo è. Fortran esegue questo calcolo con precisione singola e assegna quindi il risultato all'LHS. Il lato RHS non viene calcolato con maggiore precisione perché l'LHS è di alta precisione. digits_kind è il modo di specificare il tipo di costante digits.

+0

Perfetto, grazie. È un po 'scontato che devi farlo manualmente, ma posso conviverci. –

+4

È fondamentale in Fortran che l'RHS venga valutato senza considerare LHS e quindi assegnato. Ci sono più situazioni, dove questo è cruciale. –

+0

valutazione RHS senza riguardo per la precisione del LHS è difficilmente unico per fortran. Se fai un = 2/3 ti aspetteresti un'operazione fluttuante (forse l'aritmetica dell'interger è ciò che intendevi). Ciò che è unico (forse) per fortran è il default alla precisione singola. A male non c'è un modo standard per impostare il valore predefinito. – agentp

Problemi correlati