E 'possibile ottenere più di 16 cifre con double
precisione senza usare quadruple
? Se è possibile, dipende dal compilatore o da qualcos'altro? Perché so che qualcuno ha detto che stava lavorando con precisione double
e aveva una precisione di 22 cifre.estesa doppia precisione
risposta
Il tipo di dati double precision
deriva da Fortran 77 e l'unico requisito per questo tipo è che ha più precisione di real
. Non dovresti usarlo più.
In Fortran 90/95 e oltre, sono supportate almeno due dimensioni di numeri reali. La precisione è determinata dal parametro kind
, il cui valore dipende dal compilatore.
real(kind=8) :: a, b
di avere un modo portatile di definire la precisione, è possibile ottenere un valore kind
che consente una certa precisione utilizzando:
integer, parameter :: long_double = SELECTED_REAL_KIND(22)
quindi è possibile dichiarare le variabili come
real(kind=long_double) :: a, b
ma non è sicuro che il tuo compilatore supporterà tale precisione, nel qual caso la funzione SELECTED_REAL_KIND
restituirà un numero negativo.
vedi anche this post
Come la prima risposta Stati, il modo più portatile è quello di specificare la precisione del numero è quello di utilizzare le funzioni intrinseche. Il concetto di design della lingua è che si capisce quale precisione è richiesta per il calcolo e la si richiede, e il compilatore fornisce quella precisione o meglio. Ad esempio, se calcoli che la tua soluzione di equazioni differenziali è stabile con 11 cifre decimali, allora richiedi questo valore e il compilatore fornisce il suo tipo migliore che soddisfi i tuoi requisiti. Questo è un approccio estraneo alla maggior parte dei programmatori, che sono abituati a pensare a quali sono le poche scelte fornite dall'hardware piuttosto che a ciò di cui hanno bisogno, e forse non è così semplice poiché pochi di noi sono analisti numerici.
Se si desidera utilizzare il SELECTED_REAL_KIND intrinseca e ottimizzare per il vostro particolare compilatore e l'hardware, si potrebbe desiderare di sperimentare. Alcune combinazioni forniscono una precisione quadrupolare nel software, che sarà lenta. Un compilatore con precisione doppia e precisione estesa a 10 byte fornirà quel tipo più lungo tramite selected_real_kind (17). Un compilatore che ha una precisione doppia e quadrupla ma non una precisione estesa di 10 byte fornirà precisione quadrupolare tramite selected_real_kind (17) o selected_real_kind (32). (Non sono a conoscenza di alcun compilatore che supporti sia l'estensione a 10 byte sia il quadrupolo). Il compilatore che non ha precisione quadrupolare restituirà -1 per selected_real_kind (32).
Ma hai scritto "intero". Potrebbe solo "intero" avere 22 cifre, non "doppio"? – Shibli
'long_double' è un numero intero che viene usato per indicare il' tipo' delle variabili 'reali'' a' e 'b' tali da avere almeno la precisione 22 – steabert
@Shibli Spesso è anche utile per ottenere i tipi di galleggianti di precisione singola e doppia sul tuo sistema in modo portatile. Per questo si può usare 'intero, parametro :: sp = tipo (1.e0)' e 'intero, parametro :: dp = tipo (1.d0)'. Puoi quindi dichiarare un float a doppia precisione come 'real (kind = dp) :: double'. – Chris