Fortran - Précision numérique

Nous avons déjà discuté du fait que, dans les anciennes versions de Fortran, il y avait deux real types: le type réel par défaut et double precision type.

Cependant, Fortran 90/95 offre plus de contrôle sur la précision des types de données réels et entiers via le kind spécifie.

L'attribut aimable

Différents types de nombres sont stockés différemment à l'intérieur de l'ordinateur. lekindL'attribut vous permet de spécifier comment un nombre est stocké en interne. Par exemple,

real, kind = 2 :: a, b, c
real, kind = 4 :: e, f, g
integer, kind = 2 :: i, j, k
integer, kind = 3 :: l, m, n

Dans la déclaration ci-dessus, les variables réelles e, f et g ont plus de précision que les variables réelles a, b et c. Les variables entières l, m et n peuvent stocker des valeurs plus grandes et avoir plus de chiffres pour le stockage que les variables entières i, j et k. Bien que cela dépende de la machine.

Exemple

program kindSpecifier
implicit none

   real(kind = 4) :: a, b, c
   real(kind = 8) :: e, f, g
   integer(kind = 2) :: i, j, k
   integer(kind = 4) :: l, m, n
   integer :: kind_a, kind_i, kind_e, kind_l
   
   kind_a = kind(a)
   kind_i = kind(i)
   kind_e = kind(e)
   kind_l = kind(l)
   
   print *,'default kind for real is', kind_a
   print *,'default kind for int is', kind_i
   print *,'extended kind for real is', kind_e
   print *,'default kind for int is', kind_l
   
end program kindSpecifier

Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -

default kind for real is 4
default kind for int is 2
extended kind for real is 8
default kind for int is 4

Recherche de la taille des variables

Il existe un certain nombre de fonctions intrinsèques qui vous permettent d'interroger la taille des nombres.

Par exemple, le bit_size(i)fonction intrinsèque spécifie le nombre de bits utilisés pour le stockage. Pour les nombres réels, leprecision(x) fonction intrinsèque, renvoie le nombre de chiffres décimaux de précision, tandis que le range(x) fonction intrinsèque renvoie la plage décimale de l'exposant.

Exemple

program getSize
implicit none

   real (kind = 4) :: a
   real (kind = 8) :: b
   integer (kind = 2) :: i
   integer (kind = 4) :: j

   print *,'precision of real(4) =', precision(a)
   print *,'precision of real(8) =', precision(b)
   
   print *,'range of real(4) =', range(a)
   print *,'range of real(8) =', range(b)
   

   print *,'maximum exponent of real(4) =' , maxexponent(a)
   print *,'maximum exponent of real(8) =' , maxexponent(b)
  
   print *,'minimum exponent of real(4) =' , minexponent(a)
   print *,'minimum exponent of real(8) =' , minexponent(b)
   
   print *,'bits in integer(2) =' , bit_size(i)
   print *,'bits in integer(4) =' , bit_size(j)
   
end program getSize

Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -

precision of real(4) = 6
precision of real(8) = 15
range of real(4) = 37
range of real(8) = 307
maximum exponent of real(4) = 128
maximum exponent of real(8) = 1024
minimum exponent of real(4) = -125
minimum exponent of real(8) = -1021
bits in integer(2) = 16
bits in integer(4) = 32

Obtention de la valeur aimable

Fortran fournit deux autres fonctions intrinsèques pour obtenir la valeur kind pour la précision requise des entiers et des réels -

  • selected_int_kind (r)
  • selected_real_kind ([p, r])

La fonction selected_real_kind renvoie un entier correspondant à la valeur du paramètre de type kind nécessaire pour une précision décimale p donnée et une plage d'exposants décimaux r. La précision décimale est le nombre de chiffres significatifs et la plage d'exposants décimaux spécifie le plus petit et le plus grand nombre représentable. La plage est donc de 10-r à 10 + r.

Par exemple, selected_real_kind (p = 10, r = 99) renvoie la valeur kind nécessaire pour une précision de 10 décimales et une plage d'au moins 10-99 à 10 + 99.

Exemple

program getKind
implicit none

   integer:: i
   i = selected_real_kind (p = 10, r = 99) 
   print *,'selected_real_kind (p = 10, r = 99)', i
   
end program getKind

Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -

selected_real_kind (p = 10, r = 99) 8