web-dev-qa-db-fra.com

Paramètre de type Fortran 90

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?

37
Lana

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.

54
Andrej Panjkov

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

8
Zeus

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.

3

À 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.

1
Tim Whitcomb