Le tableau 5.1 donne la liste des opérateurs arithmétiques de Fortran. Ils sont listés par ordre de priorité croissante.
Dans une expression, on évalue donc d'abord **
puis /
,
puis *
, et enfin +
et -
.
On peut aussi grouper des sous-expressions entre parenthèses.
x=a+b/c-d |
évalue .
x=(a+b)/(c+d) |
évalue .
Lorsque deux opérandes de types différents interviennent de chaque coté d'un
opérateur :
|
Les types sont classés dans l'ordre suivant (du plus fort au plus faible) :
complex
double precision
real
integer
logical
5.1
b**2
sera du type de b
.
4*a*c
sera du type le plus fort de a
et de c
.
Si a
et c
sont real
, et b
double precision
, le
résultat de b**2-4*a*c
sera double precision
, mais attention, le
produit a*c
sera effectué en simple précision, d'où une perte de
précision possible.
2/3
sera du type integer
. Autrement dit la division effectuée sera
une division entière, et le résultat sera 0. Pour calculer effectivement deux
tiers en réel, écrire : 2./3
, 2/3.
ou 2./3.
Idem pour i/j
où
i
et j
sont deux variables integer
. Écrire :
real(i)/j
Lorsqu'une variable est affectée avec une expression de type différent, le résultat de l'expression est converti dans le type de la variable. |
i=1.3456
affectera la variable integer
i
avec 1.
Attention :
x=2/3
affectera la variable real
x
avec 0.0 !!!
Une fonction FORTRAN est une boite dans laquelle rentre un ensemble de grandeurs d'un type donné (les arguments) et de laquelle sort une grandeur d'un type donné (cf 10.4).
Certaines fonctions mathématiques sont prédéfinies dans le langage (tables
5.2 et 5.3). On
n'utilisera pas la même fonction selon le type de l'argument. Par exemple la
fonction sinus sera SIN
pour un argument réel, DSIN
pour
un argument double precision, CSIN
pour un argument complexe.
Important :
z=(a*sin(x)+b*cos(y)) / (a*sinh(x)+b*cosh(y)) |
Pour définir en double precision :
pi=4d0*datan(1d0) |
Ces fonctions permettent de convertir explicitement des données d'un type en un autre type. La figure 5.1 donne les noms des des différentes fonctions permettant à partir d'un type initial d'obtenir un autre type de valeur.
La représentation des réels en virgule flottante entraîne fatalement des erreurs5.2 :
Ces erreurs peuvent être dramatiques, dans des algorithmes sensibles aux erreurs. Lors d'une opération simple, l'erreur effectuée est petite, mais si l'algorithme amplifie ces erreurs, le résultat peut être complètement faux.
1.+1e-8
sera codé comme 1.
1d0+1d-16
sera codé comme 1d0
De nombreuses suites récurrentes exhibent les conséquences dramatiques des erreurs d'arrondi (voir TD).
Par exemple, la suite :