Fortran 90 kind paramètre

j'ai du mal à comprendre le paramètre kind de Tran 90. Pour autant que je puisse dire, il ne détermine pas la précision (i.e., flottant ou double) d'une variable, ni ne détermine le type d'une variable.

alors, que détermine-t-elle et à quoi sert-elle exactement?

29
demandé sur nbro 2009-05-08 09:03:08

4 réponses

le type d'une variable est une étiquette entière qui indique au compilateur quels types de données il doit utiliser.

attention: bien qu'il soit commun pour que le paramètre KIND soit le même que le nombre d'octets stockés dans une variable de ce type, il est non requis par la norme Fortran.

Qui est, sur beaucoup de systèmes,

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

mais il peut y avoir des compilateurs par exemple avec:

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

de même pour les types entiers et logiques.

(si j'allais creuser, je pourrais probablement trouver des exemples. Rechercher le groupe usenet comp.lang.fortran pour kind pour trouver des exemples. La discussion la plus éclairée sur Fortran a lieu là-bas, avec quelques personnes très expérimentées.)

donc, si vous ne pouvez pas compter sur une valeur de type particulier vous donnant les mêmes données représentation sur différentes plateformes, que faites-vous? C'est à cela que servent les fonctions intrinsèques SELECTED_REAL_KIND et SELECTED_INT_KIND . Fondamentalement, vous dites à la fonction Quel genre de nombres vous devez être capable de représenter, et il retournera le genre que vous avez besoin d'utiliser.

j'utilise habituellement ces types, car ils me donnent généralement 4 octets et 8 octets reals:

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

donc je pourrais par la suite déclarer une variable comme:

real(kind=r15) :: xd

notez que cela peut causer des problèmes lorsque vous utilisez des programmes en plusieurs langues, et vous devez absolument spécifier le nombre d'octets que les variables occupent. Si vous avez besoin d'en être sûr, il y a des enquêtes intrinsèques qui vous indiqueront chaque type, à partir desquelles vous pouvez déduire l'empreinte mémoire d'une variable, sa précision, sa gamme d'exposants et ainsi de suite. Ou, vous pouvez revenir à la non-standard, mais banale real*4 , real*8 etc style de déclaration.

Lorsque vous commencez avec un nouveau compilateur, cela vaut la peine de regarder les valeurs de type spécifique du compilateur afin que vous sachiez à quoi vous avez affaire. Rechercher sur le net pour kindfinder.f90 pour un programme pratique qui vous indiquera les types disponibles pour un compilateur.

47
répondu Andrej Panjkov 2016-03-07 05:20:20

je suggère d'utiliser le Fortran 2008 et plus tard; INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128 . Cela se fait en appelant ISO_FORTRAN_ENV dans Fortran 2003 et plus tard. Les paramètres Kind fournissent une manière incohérente de s'assurer que vous obtenez toujours le nombre approprié de représentation de bits

5
répondu Zeus 2015-06-15 21:11:05

du groupe Portland Fortran référence , le" paramètre KIND spécifie une précision pour les types de données intrinsèques."Ainsi, dans la déclaration

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

la variable float64 déclarée comme un 8-octet réel (l'ancien Fortran DOUBLE PRECISION ) et la variable float32 est déclarée comme un 4-octet réel (l'ancien Fortran REAL ).

C'est intéressant car il vous permet de fixer la précision pour vos variables indépendantes du compilateur et de la machine que vous utilisez. Si vous exécutez un calcul qui nécessite plus de précision que le traditionnel IEEE-single-precision real (qui, si vous prenez une classe d'analyse numérique, est très probable), mais déclarez votre variable comme real :: myVar , vous serez très bien si le compilateur est réglé par défaut toutes les valeurs real à double précision, mais en changeant les options du compilateur ou en déplaçant votre code sur une machine différente avec différents les tailles par défaut pour les variables real et integer donneront lieu à quelques mauvaises surprises (par exemple, votre solveur de matrice itératif explose).

Fortran inclut également certaines fonctions qui vous aideront à choisir un paramètre KIND pour être ce dont vous avez besoin - SELECTED_INT_KIND et SELECTED_REAL_KIND - mais si vous êtes juste en train d'apprendre Je ne me soucierais pas de ceux à ce point.

puisque vous avez mentionné que vous apprenez Fortran dans le cadre d'une classe, vous devrait également voir cette question sur Fortran resources et peut - être regarder les manuels de référence de la suite de compilateurs que vous utilisez (par exemple groupe Portland ou Intel) - ceux-ci sont généralement disponibles gratuitement.

1
répondu Tim Whitcomb 2017-05-23 12:10:41

juste élargir les autres (très bon) réponses, spécialement Andrej Panjkov 'S réponse:

le type d'une variable est une étiquette entière qui dit au compilateur qui de ses types soutenus qu'il devrait utiliser.

exactement. Bien que, pour tous les types numérique intrinsèque , le paramètre genre est utilisé pour spécifier le modèle pour la représentation et comportement des nombres sur un processeur " (mots de la Section 16.5 de la norme), qui en pratique signifie leur modèle bit, ce n'est pas la seule chose qu'un paramètre KIND peut représenter.

un paramètre KIND pour un type est toute variation dans sa nature, son modèle ou son comportement qui est disponible pour le programmeur à choisir au moment de la compilation. Par exemple, pour le type de caractère intrinsèque, le paramètre kind représente les jeux de caractères disponibles. sur le processeur (ASCII, UCS-4,...).

vous pouvez même définir vos propres variations de modèle/comportement sur vous avez défini des Types dérivés (de Fortran 2003 après). Vous pouvez créer un type de matrice Transform et avoir une version avec KIND=2 pour l'espace 2D (dans laquelle le tableau sous-jacent serait 3x3) et KIND=3 pour L'espace 3D (avec un tableau sous-jacent 4x4). Rappelez-vous juste qu'il n'y a pas de conversion automatique de type pour les types Non intrinsèques.

1
répondu Rodrigo Rodrigues 2018-05-25 04:14:41