2. Généralités▲
2-1. Bases de numération▲
Soit un nombre kitxmlcodeinlinelatexdvpnfinkitxmlcodeinlinelatexdvp dont l'écriture en base kitxmlcodeinlinelatexdvpbfinkitxmlcodeinlinelatexdvp est de la forme :
kitxmlcodelatexdvp(u_p u_{p-1}\dots u_1 u_0)_bfinkitxmlcodelatexdvpavec :
kitxmlcodelatexdvp\forall i \in \{0, 1, \dots, p\}\ 0 \le u_i < bfinkitxmlcodelatexdvpLa valeur du nombre kitxmlcodeinlinelatexdvpnfinkitxmlcodeinlinelatexdvp en base 10 est :
kitxmlcodelatexdvpn_{10} = \sum_{i=0}^p u_i b^ifinkitxmlcodelatexdvpLes ordinateurs ne savent calculer qu'en base 2, de ce fait les données stockées dans la mémoire le sont sous la forme d'une suite de chiffres binaires 0 et 1 appelés bits abréviation de binary digits. Un ensemble de 8 bits s'appelle un octet.
L'écriture des données en base 2 se révèle fastidieuse. Par commodité, on adopte plutôt la base 8 (base octale) ou la base 16 (hexadécimale) pour les définir.
L'écriture d'un nombre en octal s'effectuera à l'aide des chiffres de 0 à 7.
L'écriture d'un nombre en hexadécimal s'effectuera à l'aide des chiffres de 0 à 9 auxquels on ajoute les lettres de a à f.
Supposons que l'on dispose de l'écriture d'un nombre en base 2. Sa conversion en octal peut être faite en découpant le motif binaire par tranches de 3 bits en partant de la droite, puis en convertissant en base 10 chaque groupe obtenu.
Sa conversion en hexadécimal pourra s'effectuer de la même manière à l'aide d'un découpage par tranches de 4 bits.
Exemple
kitxmlcodelatexdvp\begin{align} 1001110101_2 & = 1*2^0 + 1*2^2 + 1*2^4 + 1*2^5 + 1*2^6 + 1*2^9\\ & = 629_{10} \\ 1001110101_2 & = 1|001|110|101_2 = 1165_8\\ 1001110101_2 & = 10|0111|0101_2 = 275_{16} \end{align}finkitxmlcodelatexdvp2-2. Représentation des données▲
2-2-1. Représentation des entiers▲
Dans la mémoire de l'ordinateur, les données numériques sont représentées à l'aide d'un motif binaire de longueur 32, 64, voire 128 bits.
La représentation en machine d'un nombre entier positif correspond à son écriture en base 2. Pour l'obtenir, il suffit de procéder à des divisions successives par 2.
Les nombres entiers négatifs sont représentés en complément vrai ou complément à 2 qui consiste, à partir du motif binaire du nombre positif, à inverser tous les bits puis d'ajouter 1.
De ce fait, sur kitxmlcodeinlinelatexdvpnfinkitxmlcodeinlinelatexdvp bits, les nombres représentables sont :
kitxmlcodelatexdvp-2^{n-1} \le i \le 2^{n-1}-1finkitxmlcodelatexdvpExemple
kitxmlcodelatexdvp\begin{align} +5_{10} &= 00000000000000000000000000000101_2 \\ -5_{10} &= 11111111111111111111111111111010_2 + 1 \\ -5_{10} &= 11111111111111111111111111111011_2 \\ -5_{10} &= FFFFFFFB_{16} \end{align}finkitxmlcodelatexdvp2-2-2. Représentation des réels▲
Un nombre réel ou flottant est caractérisé par :
- son signe ;
- son exposant ou caractéristique ;
- sa mantisse.
Son mode de représentation est un motif binaire respectant la norme IEEE.
Représentation d'un nombre réel sur 32 bits
Ce type de réel, appelé réel simple précision, admet un motif binaire de la forme :
- seeeeeeeem——m
- s : bit de signe ;
- e : exposant sur 8 bits à excédent 127 ;
- m : mantisse sur 23 bits.
Le nombre représenté correspond à :
kitxmlcodelatexdvpr = s1.m*2^{e-127}finkitxmlcodelatexdvpCe type de représentation permet de représenter les nombres :
kitxmlcodelatexdvp1.2*10^{-38} \le |r| \le 3.4*10^{+38}finkitxmlcodelatexdvpavec 6 chiffres significatifs.
Représentation d'un nombre réel sur 64 bits
Ce type de réel, appelé réel double précision, admet un motif binaire de la forme :
- seeeeeeeeeeem—–m
- s : bit de signe,
- e : exposant sur 11 bits à excédent 1023,
- m : mantisse sur 52 bits.
Le nombre représenté correspond à :
kitxmlcodelatexdvpr = s1.m*2^{e-1023}finkitxmlcodelatexdvpCe type de représentation permet de représenter les nombres :
kitxmlcodelatexdvp2.2*10^{-308} \le |r| \le 1.8*10^{+308}finkitxmlcodelatexdvpavec 15 chiffres significatifs.
2-2-3. Représentation des complexes▲
Un nombre complexe est une paire de nombres réels, simple ou double précision, correspondant aux parties réelle et imaginaire.
Exemple
Soit le nombre complexe kitxmlcodeinlinelatexdvp1.5 - 1.5ifinkitxmlcodeinlinelatexdvp
Sa représentation en simple précision nécessite 2 réels sur 32 bits :
kitxmlcodelatexdvp\begin{align} 0\ 01111111\ 1000...000_2 &= \mathrm{3FC00000}_{16} &= +1.5_{10} \\ 1\ 01111111\ 1000...000_2 &= \mathrm{BFC00000}_{16} &= -1.5_{10} \end{align}finkitxmlcodelatexdvp2-2-4. Représentation des logiques▲
Un logique est une entité qui peut prendre comme valeur :
-
.TRUE.
-
.FALSE.
Il est représenté en général sur 32 bits (4 octets). Il peut exister des variantes codées sur 1, 2, voire 8 octets. Tous les bits sont positionnés à 0 sauf le bit le plus à droite qui pour la valeur .TRUE.
est positionné à 1.
2-2-5. Représentation des caractères▲
Un caractère est codé sur 1 octet. Sa représentation interne respecte un codage appelé codage ASCII.
Il existe 128 caractères différents dont les représentations sont indiquées dans une table dite table ASCII.
Dans cette table les caractères numériques ainsi que les caractères alphabétiques (majuscules et minuscules) sont rangés consécutivement et en ordre croissant.
On appelle chaîne de caractères une suite de caractères rangés de façon consécutive en mémoire.
Caract. |
déc. |
hex |
oct. |
Caract. |
déc. |
hex |
oct. |
---|---|---|---|---|---|---|---|
C-@ (NUL) |
0 |
0x00 |
000 |
espace |
32 |
0x20 |
040 |
C-a (SOH) |
1 |
0x01 |
001 |
! |
33 |
0x21 |
041 |
C-b (STX) |
2 |
0x02 |
002 |
" |
34 |
0x22 |
042 |
C-c (ETX) |
3 |
0x03 |
003 |
# |
35 |
0x23 |
043 |
C-d (EOT) |
4 |
0x04 |
004 |
$ |
36 |
0x24 |
044 |
C-e (ENQ) |
5 |
0x05 |
005 |
% |
37 |
0x25 |
045 |
C-f (ACK) |
6 |
0x06 |
006 |
& |
38 |
0x26 |
046 |
C-g (BEL) |
7 |
0x07 |
007 |
' |
39 |
0x27 |
047 |
C-h (BS) |
8 |
0x08 |
010 |
( |
40 |
0x28 |
050 |
C-i (HT) |
9 |
0x09 |
011 |
) |
41 |
0x29 |
051 |
C-j (LF) |
10 |
0x0a |
012 |
* |
42 |
0x2a |
052 |
C-k (VT) |
11 |
0x0b |
013 |
+ |
43 |
0x2b |
053 |
C-l (FF) |
12 |
0x0c |
014 |
, |
44 |
0x2c |
054 |
C-m (CR) |
13 |
0x0d |
015 |
- |
45 |
0x2d |
055 |
C-n (SO) |
14 |
0x0e |
016 |
. |
46 |
0x2e |
056 |
C-o (SI) |
15 |
0x0f |
017 |
/ |
47 |
0x2f |
057 |
C-p (DLE) |
16 |
0x10 |
020 |
0 |
48 |
0x30 |
060 |
C-q (DC1) |
17 |
0x11 |
021 |
1 |
49 |
0x31 |
061 |
C-r (DC2) |
18 |
0x12 |
022 |
2 |
50 |
0x32 |
062 |
C-s (DC3) |
19 |
0x13 |
023 |
3 |
51 |
0x33 |
063 |
C-t (DC4) |
20 |
0x14 |
024 |
4 |
52 |
0x34 |
064 |
C-u (NAK) |
21 |
0x15 |
025 |
5 |
53 |
0x35 |
065 |
C-v (SYN) |
22 |
0x16 |
026 |
6 |
54 |
0x36 |
066 |
C-w (ETB) |
23 |
0x17 |
027 |
7 |
55 |
0x37 |
067 |
C-x (CAN) |
24 |
0x18 |
030 |
8 |
56 |
0x38 |
070 |
C-y (EM) |
25 |
0x19 |
031 |
9 |
57 |
0x39 |
071 |
C-z (SUB) |
26 |
0x1a |
032 |
: |
58 |
0x3a |
072 |
C-[ (ESC) |
27 |
0x1b |
033 |
; |
59 |
0x3b |
073 |
C-\ (FS) |
28 |
0x1c |
034 |
< |
60 |
0x3c |
074 |
C-] (GS) |
29 |
0x1d |
035 |
= |
61 |
0x3d |
075 |
C-$ (RS) |
30 |
0x1e |
036 |
> |
62 |
0x3e |
076 |
C- (US) |
31 |
0x1f |
037 |
? |
63 |
0x3f |
077 |
@ |
64 |
0x40 |
100 |
‘ |
96 |
0x60 |
140 |
A |
65 |
0x41 |
101 |
a |
97 |
0x61 |
141 |
B |
66 |
0x42 |
102 |
b |
98 |
0x62 |
142 |
C |
67 |
0x43 |
103 |
c |
99 |
0x63 |
143 |
D |
68 |
0x44 |
104 |
d |
100 |
0x64 |
144 |
E |
69 |
0x45 |
105 |
e |
101 |
0x65 |
145 |
F |
70 |
0x46 |
106 |
f |
102 |
0x66 |
146 |
G |
71 |
0x47 |
107 |
g |
103 |
0x67 |
147 |
H |
72 |
0x48 |
110 |
h |
104 |
0x68 |
150 |
I |
73 |
0x49 |
111 |
i |
105 |
0x69 |
151 |
J |
74 |
0x4a |
112 |
j |
106 |
0x6a |
152 |
K |
75 |
0x4b |
113 |
k |
107 |
0x6b |
153 |
L |
76 |
0x4c |
114 |
l |
108 |
0x6c |
154 |
M |
77 |
0x4d |
115 |
m |
109 |
0x6d |
155 |
N |
78 |
0x4e |
116 |
n |
110 |
0x6e |
156 |
O |
79 |
0x4f |
117 |
o |
111 |
0x6f |
157 |
P |
80 |
0x50 |
120 |
p |
112 |
0x70 |
160 |
Q |
81 |
0x51 |
121 |
q |
113 |
0x71 |
161 |
R |
82 |
0x52 |
122 |
r |
114 |
0x72 |
162 |
S |
83 |
0x53 |
123 |
s |
115 |
0x73 |
163 |
T |
84 |
0x54 |
124 |
t |
116 |
0x74 |
164 |
U |
85 |
0x55 |
125 |
u |
117 |
0x75 |
165 |
V |
86 |
0x56 |
126 |
v |
118 |
0x76 |
166 |
W |
87 |
0x57 |
127 |
w |
119 |
0x77 |
167 |
X |
88 |
0x58 |
130 |
x |
120 |
0x78 |
170 |
Y |
89 |
0x59 |
131 |
y |
121 |
0x79 |
171 |
Z |
90 |
0x5a |
132 |
z |
122 |
0x7a |
172 |
[ |
91 |
0x5b |
133 |
{ |
123 |
0x7b |
173 |
\ |
92 |
0x5c |
134 |
| |
124 |
0x7c |
174 |
] |
93 |
0x5d |
135 |
} |
125 |
0x7d |
175 |
^ |
94 |
0x5e |
136 |
∼ |
126 |
0x7e |
176 |
_ |
95 |
0x5f |
137 |
C-? |
127 |
0x7f |
177 |
2-3. Jeu de caractères▲
- 26 lettres de l'alphabet,
- chiffres 0 à 9,
- caractères spéciaux :
! |
* |
+ |
" |
< |
( |
= |
> |
) |
; |
% |
/ |
- |
: |
, |
? |
' |
. |
& |
$ |
- le caractère espace,
- le caractère _ (underscore).
Remarque : les caractères minuscules sont convertis en majuscules par le compilateur.
2-4. Notion d'unité de programme▲
Un programme source Fortran est composé de parties indépendantes appelées unités de programme (scoping unit).
Chaque partie est compilée de façon indépendante. Chacune admet son propre environnement. Il sera cependant possible que ces parties communiquent entre elles.
Les différentes unités de programme sont :
- le programme principal ;
-
les sous-programmes :
- de type subroutine,
- de type function ;
- les modules ;
- les block data.
Chaque unité comprend une partie déclarative (déclaration des variables locales…) suivie d'une partie comportant des instructions exécutables, l'instruction STOP
interrompt le programme.
2-5. Éléments syntaxiques▲
2-5-1. Format libre▲
Dans le mode « format libre » les lignes peuvent être de longueur quelconque à concurrence de 132 caractères.
Il est également possible de coder plusieurs instructions sur une même ligne en les séparant avec le caractère « ; ».
print
*, ' Entrez une valeur :'
; read
*,n
Une instruction peut être codée sur plusieurs lignes : on utilisera alors le caractère « & ».
2.
3.
print
*, 'Montant HT :'
, montant_ht, &
' TVA :'
, tva , &
'Montant TTC :'
, montant_ttc
Lors de la coupure d'une chaîne de caractères, la suite de la chaîne doit obligatoirement être précédée du caractère « & ».
2.
print
*, 'Entrez un nombre entier &
&compris entre 100 & 199'
Remarque : il existe aussi le « Format fixe », considéré maintenant comme obsolète dont la structure d'une ligne est :
- zone étiquette (colonnes 1 à 5) ;
- zone instruction (colonnes 7 à 72) ;
- colonne suite (colonne 6).
2-5-2. Commentaires▲
Le caractère « ! » rencontré sur une ligne indique que ce qui suit est un commentaire. On peut évidemment écrire une ligne complète de commentaires : il suffit pour cela que le 1er caractère non blanc soit le caractère « ! »
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if
(n <
100 .or.
n >
199) ! Test cas d'erreur
. . . .
! On lit l'exposant
read
*,x
! On lit la base
read
*,y
if
(y <=
0) then
! Test cas d'erreur
print
*, ' La base doit être un nombre >0'
else
z = y**x ! On calcule la puissance
end
if
Remarque : en format fixe, les lignes qui commencent par C
, c
, *
ou !
en colonne 1 sont des commentaires.