Introduction
Les types de données au format Réel appartiennent à la famille EDT (Elementary data type, type de données élémentaires), qui contient des types de données simples et non dérivés (tableaux, structures, blocs fonction).
Rappel concernant le format Réel
Le format Réel (virgule flottante selon la norme ANSI/IEEE 754) utilise un codage de format 32 bits qui correspond aux nombres réels à virgule flottante à une décimale.
Les 32 bits qui représentent la valeur à virgule flottante sont organisés dans les trois champs distincts qui sont :
S, le bit de signe qui peut avoir l'une des valeurs suivantes :
0, pour un nombre à virgule flottante positif
1, pour un nombre à virgule flottante négatif
e, l'exposant codé dans un champ de 8 bits (entier au format binaire)
f, la partie correspondant à la virgule décimale dans un champ de 23 bits (entier au format binaire)
Représentation :

La valeur de la partie correspondant à la virgule décimale (Mantissa) est comprise entre [0, 1[, et calculée avec la formule ci-après.

Types de nombres pouvant être représentés
Il s'agit des nombres suivants :
normalisés
non normalisés
de valeur infinie
avec les valeurs + 0 et - 0
Le tableau suivant indique les valeurs dans les différents champs suivant le type de nombre.
e |
f |
S |
Type de nombre |
---|---|---|---|
]0, 255[ |
[0, 1[ |
0 ou 1 |
normalisé |
0 |
[0, 1[ |
environ (1.4E-45) |
non normalisé |
255 |
0 |
0 |
+ infini (INF) |
255 |
0 |
1 |
- infini (-INF) |
255 |
]0,1[ et bit 22 = 0 |
0 ou 1 |
|
255 |
]0,1[ et bit 22 = 1 |
0 ou 1 |
|
0 |
0 |
0 |
+0 |
0 |
0 |
1 |
-0 |
NAN
(Pas un nombre) : QNAN
et SNAN
.QNAN
:NAN
dont le bit 22 correspond à 1SNAN
:NAN
dont le bit 22 correspond à 0
Le tableau ci-dessous présente la formule de calcul de la valeur du nombre à virgule flottante :
Nombre à virgule flottante |
Valeur |
---|---|
Normalisé |
![]() |
Non normalisé ( |
![]() |
DEN
. Lorsqu'une opérande correspond à un DEN
, le résultat n'est pas garanti. Les bits %SW17 et %S18 sont augmentés, sauf pour le Modicon M340. Les automates Modicon
M340 peuvent utiliser des opérandes non normalisés, mais
avec une perte de précision en raison du format. Le dépassement
inférieur est signalé suivant l'opération uniquement
lorsque le résultat est égal à 0 (dépassement
inférieur total) ou lorsqu'il est non normalisé (dépassement
inférieur graduel, avec perte de précision).Type réel
Présentation :
Type |
Echelle (bits) |
Valeur par défaut |
---|---|---|
REAL |
32 |
0.0 |
Plage de valeurs (parties grisées) :

Lorsqu'un résultat est :
compris entre -1,1754944e-38 et 1,1754944e-38, il s'agit d'un
DEN
;inférieur à -3,4028234e+38, le symbole
-INF
(pour - infini) s'affiche ;supérieur à +3,4028234e+38, le symbole
INF
(pour + infini) s'affiche ;indéfini (racine carrée d'un nombre négatif), le symbole
NAN
s'affiche.
Exemple de valeur normalisée inexacte
7,986 est codé de la façon suivante par l'application :
S |
E=129 |
M=8359248 |
---|---|---|
0 |
1000001 |
11111111000110101010000 |
Avec la formule :

Le nombre 7,986 devrait correspondre à :

Le significatif étant exprimé sous forme d'entier, il peut être codé uniquement sous la forme 8359248 (arrondi à la limite la plus proche).
Aucun nombre ne peut être codé entre le chiffre significatif 8359247 et 8359248, ou entre le nombre réel 7,985999584197998046875 et 7,98600006103515625
Poids du bit le moins significatif (écart) en précision absolue :

L'écart devient très important pour les valeurs élevées comme indiqué ci-dessous :
Valeur |
![]() |
M=8359248 |
---|---|---|
100 000 000 |
Entre 226 et 227 |
![]() |
2127 |
2127 |
![]() |
Pour obtenir la résolution attendue, il est nécessaire de définir la plage maximale du calcul conformément à la formule suivante :

p correspond à la précision et e à l'exposant (e = E-127)
Par exemple, si la précision doit être égale à 0,001, la partie correspondant à la virgule décimale sera :

avec :

Au-delà de la limite F, la précision est perdue.
Cas classique : compteurs
Il convient de faire preuve de discernement dans l'utilisation des nombres à virgule flottante, en particulier lorsqu'il est nécessaire d'y ajouter une faible valeur.
Lors de petits incréments, le compteur ne fonctionne pas correctement et donne des résultats erronés sans augmentation lorsque l'incrément est inférieur au bit le moins significatif du compteur.
Pour obtenir des valeurs correctes, il est recommandé de s'appuyer
sur un entier double (UDINT
) et de multiplier le
résultat par un incrément.
Exemple :
Incrémentez une valeur de 0,001 de 33000 à 1000000.
Comptez de 33000000 à 1000000000 (valeur multipliée par 1000) avec un agrément de 1.
Obtenez le résultat en multipliant la valeur par 0,001.
La précision minimale F par plage sera la suivante :
De...à... |
F (minimum) |
---|---|
3300 à 65536 |
0,004 |
65536 à 131072 |
0,008 |
... |
... |
524288 à 1000000 |
0,063 |
Ce compteur peut aller jusqu'à 4294967295 x 0,001 = 4294967,5 avec une précision minimale de 0,5