Fortran 90 parametro gentile

Ho difficoltà a capire il parametro kind Fortran 90. Per quanto posso dire, non determina la precisione (cioè, float o double) di una variabile, né determina il tipo di una variabile.

Quindi, cosa determina e a cosa serve esattamente?

Il KIND di una variabile è un’etichetta intera che dice al compilatore quale dei suoi tipi supportati dovrebbe usare.

Attenzione, sebbene sia comune che il parametro KIND sia uguale al numero di byte memorizzati in una variabile di quel TIPO, non è richiesto dallo standard Fortran.

Cioè, su molti sistemi,

 REAl(KIND=4) :: xs ! 4 byte ieee float REAl(KIND=8) :: xd ! 8 byte ieee float REAl(KIND=16) :: xq ! 16 byte ieee float 

ma ci possono essere compilatori per esempio con:

 REAL(KIND=1) :: XS ! 4 BYTE FLOAT REAL(KIND=2) :: XD ! 8 BYTE FLOAT REAL(KIND=3) :: XQ ! 16 BYTE FLOAT 

Allo stesso modo per i tipi interi e logici.

(Se ho iniziato a scavare, potrei probabilmente trovare degli esempi. Cerca il gruppo usenet comp.lang.fortran per trovare esempi. La discussione più informata su Fortran si verifica lì, con alcune persone con grande esperienza che contribuiscono).

Quindi, se non puoi contare su un particolare valore di tipo che ti dà la stessa rappresentazione dei dati su piattaforms diverse, che cosa fai? Ecco a cosa servono le funzioni intrinseche SELECTED_REAL_KIND e SELECTED_INT_KIND . Fondamentalmente, dici alla funzione che tipo di numeri devi essere in grado di rappresentare e restituirà il tipo che devi usare.

Di solito uso questi tipi, dato che di solito mi danno 4 reali e 8 byte reali:

 !--! specific precisions, usually same as real and double precision integer, parameter :: r6 = selected_real_kind(6) integer, parameter :: r15 = selected_real_kind(15) 

Quindi potrei successivamente dichiarare una variabile come:

 real(kind=r15) :: xd 

Notare che ciò potrebbe causare problemi quando si utilizzano programmi con lingue miste e occorre specificare in modo assoluto il numero di byte occupati dalle variabili. Se devi assicurarti che ci sono delle informazioni intrinseche che ti descrivono su ogni tipo, da cui puoi dedurre l’impronta di memoria di una variabile, la sua precisione, l’intervallo esponenziale e così via. In alternativa, è ansible ripristinare lo stile di dichiarazione non standard, comune, real*4 , real*8 ecc.

Quando inizi con un nuovo compilatore, vale la pena esaminare i valori del tipo specifico del compilatore in modo da sapere con cosa hai a che fare. Cerca in rete per kindfinder.f90 per un comodo programma che ti spiegherà i tipi disponibili per un compilatore.

Suggerisco di utilizzare Fortran 2008 e versioni successive; INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128 . Questo viene fatto chiamando ISO_FORTRAN_ENV in Fortran 2003 e ISO_FORTRAN_ENV successive. I parametri gentili forniscono un modo incoerente per garantire di ottenere sempre il numero appropriato di bit di rappresentazione

Dal riferimento Fortran del gruppo Portland , il parametro KIND “specifica una precisione per i tipi di dati intrinseci”. Quindi, nella dichiarazione

 real(kind=4) :: float32 real(kind=8) :: float64 

la variabile float64 dichiarata come un vero 8 byte (il vecchio Fortran DOUBLE PRECISION ) e la variabile float32 è dichiarata come un vero 4 byte (il vecchio Fortran REAL ).

Questo è bello perché ti consente di correggere la precisione delle tue variabili indipendentemente dal compilatore e dalla macchina su cui stai lavorando. Se stai eseguendo un calcolo che richiede una maggiore precisione rispetto al tradizionale IEEE-single-precision reale (che, se stai prendendo una class di analisi numerica, è molto probabile), ma dichiara la tua variabile come real :: myVar , dovrai va bene se il compilatore è impostato per predefinire tutti real valori real con precisione doppia, ma la modifica delle opzioni del compilatore o lo spostamento del codice su una macchina diversa con dimensioni predefinite diverse per variabili real e integer porterà ad alcune sorprese forse brutte (ad esempio il tuo iterativo il risolutore di matrice esplode).

Fortran include anche alcune funzioni che ti aiuteranno a scegliere un parametro KIND per essere quello che ti serve – SELECTED_INT_KIND e SELECTED_REAL_KIND – ma se stai imparando, non mi preoccuperei di quelli a questo punto.

Dato che hai detto che stai imparando Fortran come parte di una class, dovresti anche vedere questa domanda sulle risorse di Fortran e magari guardare i manuali di riferimento dalla suite di compilatori che stai usando (ad es. Portland Group o Intel) – questi di solito liberamente disponibile.

Semplicemente espandendo le altre (molto buone) risposte, specialmente la risposta di Andrej Panjkov :

Il KIND di una variabile è un’etichetta intera che dice al compilatore quale dei suoi tipi supportati dovrebbe usare.

Esattamente. Anche se, per tutti i tipi intrinseci numerici , il parametro KIND è usato per specificare il ” modello per la rappresentazione e il comportamento dei numeri su un processore ” (parole dalla Sezione 16.5 dello standard), che in pratica significa il loro modello di bit, non è l’unica cosa che può rappresentare un parametro KIND.

Un parametro KIND per un tipo è qualsiasi variazione nella sua natura, modello o comportamento che è disponibile per il programmatore da scegliere in fase di compilazione. Ad esempio, per il tipo di carattere intrinseco, il parametro kind rappresenta i set di caratteri disponibili sul processore (ASCII, UCS-4, …).

È anche ansible definire il proprio modello / variazioni di comportamento sui tipi derivati ​​definiti dall’utente (da Fortran 2003 in poi). Puoi creare un tipo di matrice di trasformazione e avere una versione con KIND = 2 per lo spazio 2D (in cui l’array sottostante sarebbe 3×3) e KIND = 3 per lo spazio 3D (con un array sottostante 4×4). Ricorda solo che non esiste una conversione di tipo automatico per tipi non intrinsechi.