IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Les notions de base du Fortran

Support de cours


précédentsommairesuivant

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)_bfinkitxmlcodelatexdvp

avec :

kitxmlcodelatexdvp\forall i \in \{0, 1, \dots, p\}\ 0 \le u_i < bfinkitxmlcodelatexdvp

La valeur du nombre kitxmlcodeinlinelatexdvpnfinkitxmlcodeinlinelatexdvp en base 10 est :

kitxmlcodelatexdvpn_{10} = \sum_{i=0}^p u_i b^ifinkitxmlcodelatexdvp

Les 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}finkitxmlcodelatexdvp

2-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}-1finkitxmlcodelatexdvp

Exemple

kitxmlcodelatexdvp\begin{align} +5_{10} &= 00000000000000000000000000000101_2 \\ -5_{10} &= 11111111111111111111111111111010_2 + 1 \\ -5_{10} &= 11111111111111111111111111111011_2 \\ -5_{10} &= FFFFFFFB_{16} \end{align}finkitxmlcodelatexdvp

2-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}finkitxmlcodelatexdvp

Ce type de représentation permet de représenter les nombres :

kitxmlcodelatexdvp1.2*10^{-38} \le |r| \le 3.4*10^{+38}finkitxmlcodelatexdvp

avec 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}finkitxmlcodelatexdvp

Ce type de représentation permet de représenter les nombres :

kitxmlcodelatexdvp2.2*10^{-308} \le |r| \le 1.8*10^{+308}finkitxmlcodelatexdvp

avec 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}finkitxmlcodelatexdvp

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

Tab. 1 – table des codes ASCII des caractères

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 « ; ».

Exemple
Sélectionnez
print *, ' Entrez une valeur :'; read *,n

Une instruction peut être codée sur plusieurs lignes : on utilisera alors le caractère « & ».

Exemple
Sélectionnez
1.
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 « & ».

Exemple
Sélectionnez
1.
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 « ! »

Exemple
Sélectionnez
1.
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.


précédentsommairesuivant

Copyright © 2006 Patrick Corde et Anne Fouilloux. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.