Valeurs de virgules flottantes

Ces informations s’appliquent aux automates
CompactLogix
 5370,
ControlLogix
 5570,
Compact GuardLogix
 5370,
GuardLogix
 5570,
Compact GuardLogix
 5380,
CompactLogix
 5380,
ControlLogix
 5580,
GuardLogix
 5580 et ControlLogix 5590. Les différences entre les automates sont signalées, le cas échéant.
Les automates Logix prennent en charge les valeurs, flottantes conformément à la norme IEEE 754 sur l'arithmétique à virgule flottante. Cette norme définit comment les nombres à virgule flottante sont stockés et calculés. La norme IEEE 754 pour les mathématiques à virgule flottante a été conçue pour permettre la vitesse et la possibilité de prendre en charge de très grands nombres dans une quantité d'espace de stockage raisonnable.
Une étiquette REAL stocke un nombre simple précision à virgule flottante normalisé.
Une balise LREAL stocke un nombre double précision à virgule flottante normalisé.
Les automates prennent en charge les types de données élémentaires suivants :
Automates
Type de données
Automates
CompactLogix
 5380,
ControlLogix
 5580,
Compact GuardLogix
 5380
GuardLogix
 5580 et ControlLogix 5590
REAL, LREAL
Automates CompactLogix 5370, ControlLogix 5570, Compact GuardLogix 5370 et GuardLogix 5570
REAL
Les nombres des normalisés et -0,0 sont traités en tant que 0,0.
Si un calcul donne une valeur NAN, le bit du signe peut être positif ou négatif. Dans cette situation, le logiciel affiche 1#.NAN sans signe.
Les valeurs décimales ne peuvent pas toutes être exactement représentées dans ce format de norme, ce qui entraîne une perte de précision. Par exemple, si vous soustrayez 10 de 10,1, vous vous attendez à ce que le résultat soit 0,1. Dans un automate Logix, le résultat pourrait très bien être 0,10000038. Dans cet exemple, la différence entre 0,1 et 0,10000038 est de 0,000038%, soit presque zéro. Pour la plupart des opérations, cette petite imprécision est minime. Pour replacer les choses dans leur contexte, si vous envoyiez une valeur, flottante vers un module de sortie analogique, il n'y aurait aucune différence dans la tension de sortie pour une valeur envoyée au module qui présente une différence de 0,000038 %.
Recommandation générale pour les opérations mathématiques sur les nombres à virgule flottante
Respectez les recommandations suivantes :
Lorsque vous effectuez certaines opérations mathématiques avec des nombres à virgule flottante, il peut y avoir une perte de précision en raison de l'erreur d'arrondi. Les processeurs à virgule flottante possèdent leur propre précision interne qui peut avoir une incidence sur les valeurs résultantes.
N'utilisez pas les mathématiques à virgule flottante pour des valeurs concernant de l'argent ou pour des fonctions de totalisation. Utilisez des valeurs INT ou DINT, mettez les valeurs à l'échelle, et conservez le suivi de la position décimale (ou utilisez une valeur INT ou DINT pour les dollars, et une deuxième valeur INT ou DINT pour les centimes).
Ne comparez pas des nombres à virgule flottante. Vérifiez plutôt des valeurs dans une plage. L'instruction LIM est fournie spécifiquement à cet effet.
Exemples de totalisateur
La précision du type de données REAL affecte les applications de totalisation, en produisant par exemple des erreurs lors de l'ajout de très grands nombres à de très petits nombres.
Par exemple, ajouter 1 un nombre pendant un certain temps. À un certain point, l'ajout n'affectera plus le résultat, car la somme en cours est beaucoup plus grande que 1 et il n'y a pas suffisamment de bits pour stocker la totalité du résultat. L'ajout stocke autant de bits de poids supérieur que possible et ignore les bits de poids inférieur restants.
Pour contourner cela, effectuez des opérations mathématiques sur de petits nombres jusqu'à ce que le résultat devienne important. Ensuite, transférez-les vers un autre emplacement pour effectuer des opérations mathématiques supplémentaires sur des grands nombres. Par exemple :
  • x est la variable de petit incrément.
  • x est la variable de grand incrément.
  • z est le nombre total actuel pouvant être utilisé partout.
  • x = x+1;
  • if x = 100,000;
  • {
  • y = y + 100,000;
  • x = 0;
  • }
  • z = y + x;
Voici un autre exemple :
  • x = x + some_tiny_number;
  • if (x >= 100)
  • {
  • z = z + 100;
  • x = x - 100; // there might be a tiny remainder
  • }
Fournir une réponse
Vous avez des questions ou des commentaires sur cette documentation ? Veuillez envoyer vos commentaires ici.
Normal