J'ai du mal à comprendre le paramètre kind
de Fortran 90. Pour autant que je sache, il ne détermine pas la précision (c'est-à-dire flottant ou double) d'une variable, ni le type d'une variable.
Alors, que détermine-t-il et à quoi sert-il exactement?
Le KIND d'une variable est une étiquette entière qui indique au compilateur quels types pris en charge 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 KIND, il est non requis par la norme Fortran.
Autrement dit, sur de nombreux 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. Recherchez le groupe usenet comp.lang.fortran pour kind
pour trouver des exemples. La discussion la plus informée de Fortran s'y produit, avec la participation de personnes très expérimentées.)
Donc, si vous ne pouvez pas compter sur une valeur de type particulière pour vous donner la même représentation de données sur différentes plateformes, que faites-vous? Voilà ce que les fonctions intrinsèques SELECTED_REAL_KIND
et SELECTED_INT_KIND
sont pour. Fondamentalement, vous indiquez à la fonction le type de nombres dont vous avez besoin pour pouvoir représenter, et elle renverra le type que vous devez utiliser.
J'utilise généralement ces types, car ils me donnent généralement des réels de 4 octets et 8 octets:
!--! specific precisions, usually same as real and double precision
integer, parameter :: r6 = selected_real_kind(6)
integer, parameter :: r15 = selected_real_kind(15)
Je pourrais par la suite déclarer une variable comme:
real(kind=r15) :: xd
Notez que cela peut provoquer 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 devez vous en assurer, il existe des éléments intrinsèques de recherche qui vous renseigneront sur chaque type, à partir duquel vous pouvez déduire l'empreinte mémoire d'une variable, sa précision, sa plage d'exposants, etc. Vous pouvez également revenir à la version non standard mais courante real*4
, real*8
etc style de déclaration.
Lorsque vous commencez avec un nouveau compilateur, il vaut la peine d'examiner les valeurs de type spécifiques au compilateur afin que vous sachiez à quoi vous avez affaire. Recherchez sur le net kindfinder.f90
pour un programme pratique qui vous renseignera sur les types disponibles pour un compilateur.
Je suggère d'utiliser le Fortran 2008 et versions ultérieures; INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128
. Pour ce faire, appelez ISO_FORTRAN_ENV
dans Fortran 2003 et versions ultérieures. Les paramètres Kind fournissent un moyen incohérent pour vous assurer d'obtenir toujours le nombre approprié de représentation binaire
Il suffit d'élargir les autres (très bonnes) réponses, spécialement Andrej Panjkov 's answer:
Le KIND d'une variable est une étiquette entière qui indique au compilateur quels types pris en charge il doit utiliser.
Exactement. Même si, pour tous les types numériques intrinsèques , le paramètre KIND est utilisé pour spécifier le modèle " pour la représentation et le comportement des nombres sur un processeur "(mots de la section 16.5 de la norme), cela signifie en pratique leur modèle de bits, 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, que le programmeur peut 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 les types dérivés que vous avez définis (à partir de Fortran 2003 par la suite). Vous pouvez créer un type de matrice de transformation et avoir une version avec KIND = 2 pour l'espace 2D (dans lequel le tableau sous-jacent serait 3x3) et KIND = 3 pour l'espace 3D (avec un tableau sous-jacent 4x4). N'oubliez pas qu'il n'y a pas de conversion de type automatique pour les types non intrinsèques.
À partir du Portland Fortran Reference , 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é comme un réel de 8 octets (l'ancien Fortran DOUBLE PRECISION
) et la variable float32
est déclaré comme un réel de 4 octets (l'ancien Fortran REAL
).
C'est bien car cela vous permet de fixer la précision de vos variables indépendamment du compilateur et de la machine sur lesquels vous travaillez. Si vous exécutez un calcul qui nécessite plus de précision que le réel traditionnel à simple précision IEEE (ce qui, si vous prenez une classe d'analyse numérique, est très probable), mais déclarez votre variable comme real :: myVar
, tout ira bien si le compilateur est défini par défaut sur toutes les valeurs de real
en double précision, mais en changeant les options du compilateur ou en déplaçant votre code vers une machine différente avec des tailles par défaut différentes pour real
et integer
les variables entraîneront peut-être de mauvaises surprises (par exemple, votre solveur de matrice itérative explose).
Fortran comprend également quelques 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 en train d'apprendre, je ne m'en inquiéterais pas pour l'instant.
Puisque vous avez mentionné que vous apprenez Fortran dans le cadre d'une classe, vous devriez également voir cette question sur ressources Fortran et peut-être consulter les manuels de référence de la suite de compilation que vous utilisez (par exemple Portland Group ou Intel) - ceux-ci sont généralement disponibles gratuitement.