Fortran - Numéros
Les nombres dans Fortran sont représentés par trois types de données intrinsèques -
- Type entier
- Type réel
- Type complexe
Type entier
Les types entiers ne peuvent contenir que des valeurs entières. L'exemple suivant extrait la plus grande valeur qui pourrait être contenue dans un entier habituel de quatre octets -
program testingInt
implicit none
integer :: largeval
print *, huge(largeval)
end program testingInt
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
2147483647
Veuillez noter que le huge()La fonction donne le plus grand nombre que peut contenir le type de données entier spécifique. Vous pouvez également spécifier le nombre d'octets à l'aide dukindprescripteur. L'exemple suivant illustre ceci -
program testingInt
implicit none
!two byte integer
integer(kind = 2) :: shortval
!four byte integer
integer(kind = 4) :: longval
!eight byte integer
integer(kind = 8) :: verylongval
!sixteen byte integer
integer(kind = 16) :: veryverylongval
!default integer
integer :: defval
print *, huge(shortval)
print *, huge(longval)
print *, huge(verylongval)
print *, huge(veryverylongval)
print *, huge(defval)
end program testingInt
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647
Type réel
Il stocke les nombres à virgule flottante, tels que 2.0, 3.1415, -100.876, etc.
Traditionnellement, 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 prescripteur, que nous étudierons sous peu.
L'exemple suivant montre l'utilisation d'un type de données réel -
program division
implicit none
! Define real variables
real :: p, q, realRes
! Define integer variables
integer :: i, j, intRes
! Assigning values
p = 2.0
q = 3.0
i = 2
j = 3
! floating point division
realRes = p/q
intRes = i/j
print *, realRes
print *, intRes
end program division
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
0.666666687
0
Type complexe
Ceci est utilisé pour stocker des nombres complexes. Un nombre complexe comprend deux parties: la partie réelle et la partie imaginaire. Deux unités de stockage numériques consécutives stockent ces deux pièces.
Par exemple, le nombre complexe (3,0, -5,0) est égal à 3,0 - 5,0i
La fonction générique cmplx()crée un nombre complexe. Il produit un résultat dont les parties réelles et imaginaires sont en simple précision, quel que soit le type des arguments d'entrée.
program createComplex
implicit none
integer :: i = 10
real :: x = 5.17
print *, cmplx(i, x)
end program createComplex
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
(10.0000000, 5.17000008)
Le programme suivant démontre l'arithmétique des nombres complexes -
program ComplexArithmatic
implicit none
complex, parameter :: i = (0, 1) ! sqrt(-1)
complex :: x, y, z
x = (7, 8);
y = (5, -7)
write(*,*) i * x * y
z = x + y
print *, "z = x + y = ", z
z = x - y
print *, "z = x - y = ", z
z = x * y
print *, "z = x * y = ", z
z = x / y
print *, "z = x / y = ", z
end program ComplexArithmatic
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
(9.00000000, 91.0000000)
z = x + y = (12.0000000, 1.00000000)
z = x - y = (2.00000000, 15.0000000)
z = x * y = (91.0000000, -9.00000000)
z = x / y = (-0.283783793, 1.20270276)
La gamme, la précision et la taille des nombres
La plage des nombres entiers, la précision et la taille des nombres à virgule flottante dépendent du nombre de bits alloués au type de données spécifique.
Le tableau suivant affiche le nombre de bits et la plage des nombres entiers -
Nombre de bits | Valeur maximum | Raison |
---|---|---|
64 | 9 223 372 036 854 774 807 | (2 ** 63) –1 |
32 | 2 147 483 647 | (2 ** 31) –1 |
Le tableau suivant affiche le nombre de bits, la valeur la plus petite et la plus grande et la précision des nombres réels.
Nombre de bits | La plus grande valeur | La plus petite valeur | Précision |
---|---|---|---|
64 | 0,8E + 308 | 0,5E – 308 | 15 à 18 |
32 | 1,7E + 38 | 0,3E – 38 | 6-9 |
Les exemples suivants le démontrent -
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+40
y = 3.73e+40
z = x * y
print *, z
end program rangePrecision
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
x = 1.5e+40
1
Error : Real constant overflows its kind at (1)
main.f95:5.12:
y = 3.73e+40
1
Error : Real constant overflows its kind at (1)
Maintenant, utilisons un nombre plus petit -
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+20
y = 3.73e+20
z = x * y
print *, z
z = x/y
print *, z
end program rangePrecision
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
Infinity
0.402144760
Maintenant regardons le sous-flux -
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e-30
y = 3.73e-60
z = x * y
print *, z
z = x/y
print *, z
end program rangePrecision
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
y = 3.73e-60
1
Warning : Real constant underflows its kind at (1)
Executing the program....
$demo
0.00000000E+00
Infinity
Le spécificateur aimable
En programmation scientifique, il est souvent nécessaire de connaître l'étendue et la précision des données de la plate-forme matérielle sur laquelle le travail est effectué.
La fonction intrinsèque kind() vous permet d'interroger les détails des représentations de données du matériel avant d'exécuter un programme.
program kindCheck
implicit none
integer :: i
real :: r
complex :: cp
print *,' Integer ', kind(i)
print *,' Real ', kind(r)
print *,' Complex ', kind(cp)
end program kindCheck
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
Integer 4
Real 4
Complex 4
Vous pouvez également vérifier le type de tous les types de données -
program checkKind
implicit none
integer :: i
real :: r
character :: c
logical :: lg
complex :: cp
print *,' Integer ', kind(i)
print *,' Real ', kind(r)
print *,' Complex ', kind(cp)
print *,' Character ', kind(c)
print *,' Logical ', kind(lg)
end program checkKind
Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -
Integer 4
Real 4
Complex 4
Character 1
Logical 4