Question

Dans le prolongement de cette question, il semble que certains nombres ne peuvent pas du tout être représentés par une virgule flottante et sont plutôt approximés.

Comment les nombres à virgule flottante sont-ils stockés ?

Existe-t-il une norme commune pour les différentes tailles ?

À quels types de pièges dois-je faire attention si j'utilise la virgule flottante ?

Sont-ils compatibles entre plusieurs langues (c'est-à-dire quelles conversions dois-je effectuer pour envoyer un nombre à virgule flottante d'un programme Python vers un programme C via TCP/IP) ?

-Adam

Était-ce utile?

La solution

Comme mentionné, le Article Wikipédia sur IEEE 754 fait un bon travail en montrant comment les nombres à virgule flottante sont stockés sur la plupart des systèmes.

Maintenant, voici quelques pièges courants :

  • Le plus important est que vous ne voulez presque jamais comparer deux nombres à virgule flottante pour déterminer leur égalité (ou inégalité).Vous souhaiterez plutôt utiliser des comparaisons supérieures/inférieures à.
  • Plus vous effectuez d’opérations sur un nombre à virgule flottante, plus les erreurs d’arrondi peuvent devenir importantes.
  • La précision est limitée par la taille de la fraction, vous ne pourrez donc peut-être pas additionner correctement des nombres séparés par plusieurs ordres de grandeur.(Par exemple, vous ne pourrez pas ajouter 1E-30 à 1E30.)

Autres conseils

Une explication détaillée des problèmes liés aux nombres à virgule flottante est donnée dans l'article Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante.

La norme est IEEE 754.

Bien sûr, il existe d'autres moyens de stocker des numéros lorsque IEE754 n'est pas suffisant.Des bibliothèques comme celle de Java BigDecimal sont disponibles pour la plupart des plates-formes et correspondent bien au type de numéro SQL.Les symboles peuvent être utilisés pour les nombres irrationnels, et les ratios qui ne peuvent pas être représentés avec précision en virgule flottante binaire ou décimale peuvent être stockés sous forme de ratio.

Quant à la deuxième partie de votre question, à moins que les performances et l'efficacité ne soient importantes pour votre projet, je vous suggère de transférer les données à virgule flottante sous forme de chaîne via TCP/IP.Cela vous permet d'éviter des problèmes tels que l'alignement des octets et facilitera le débogage.

Fondamentalement, ce dont vous devez vous soucier dans les nombres à virgule flottante, c'est qu'il existe un nombre limité de chiffres de précision.Cela peut poser des problèmes lors des tests d'égalité ou si votre programme a réellement besoin de plus de chiffres de précision que ce que ce type de données vous donne.

En C++, une bonne règle de base est de penser qu’un float vous donne 7 chiffres de précision, tandis qu’un double vous en donne 15.De plus, si vous souhaitez savoir comment tester l'égalité, vous pouvez consulter ce fil de questions.

En suivant cette question, il semble que certains nombres ne peuvent pas être représentés par un point flottant du tout et sont plutôt approximés.

Correct.

Comment les nombres à virgule flottante sont-ils stockés ?Existe-t-il une norme commune pour les différentes tailles ?

Comme les autres affiches déjà mentionnées, presque exclusivement IEEE754 et son successeur IEEE754R.La recherche sur Google vous donne des milliers d'explications ainsi que des modèles de bits et leur explication.Si vous rencontrez encore des difficultés pour l'obtenir, il existe deux formats FP encore courants :IBM et DEC-VAX.Pour certaines machines et compilateurs ésotériques (blitzbasic, turbopascal), il existe des formats impairs.

À quels types de pièges dois-je faire attention si j'utilise la virgule flottante ?Sont-ils compatibles en langue transversale (c'est-à-dire quelles conversions dois-je gérer pour envoyer un numéro de point flottant d'un programme Python à un programme C sur TCP / IP)?

Pratiquement aucun, ils sont compatibles entre les langues.

Des bizarreries très rares :

  • IEEE754 définit les sNaN (NaN de signalisation) et les qNaN (NaN silencieux).Les premiers provoquent une interruption qui oblige le processeur à appeler une routine de gestion s'il est chargé.Ces derniers ne font pas ça.Parce que les concepteurs de langage détestaient la possibilité que les sNaN interrompent leur flux de travail et que leur prise en charge impose la prise en charge des routines de gestion, les sNaN sont presque toujours convertis silencieusement en qNaN.Ne comptez donc pas sur une conversion brute 1:1.Mais:Ceci est très rare et ne se produit que si les NAN sont présents.

  • Vous pouvez avoir des problèmes d'endianisme (les octets sont dans le mauvais ordre) si des fichiers sont partagés entre différents ordinateurs.Il est facilement détectable car vous obtenez des NaN pour les nombres.

Oui, il y a le Norme IEEE pour l'arithmétique binaire à virgule flottante (IEEE 754)

Le nombre est divisé en trois parties, signe, exposant et fraction, lorsqu'il est stocké en binaire.

Ce article intitulé "Numéros à virgule flottante selon la norme IEEE 754" peut être utile.Pour être honnête, je ne suis pas complètement sûr de comprendre votre question, donc je ne suis pas sûr que cela va être utile, mais j'espère que ce sera le cas.

Si vous êtes vraiment préoccupé par les erreurs d'arrondi en virgule flottante, la plupart des langages proposent des types de données qui ne comportent pas d'erreurs en virgule flottante.SQL Server possède les types de données Decimal et Money..Net a le type de données Decimal.Ils ne sont pas d'une précision infinie comme BigDecimal en Java, mais ils sont précis jusqu'au nombre de points décimaux pour lesquels ils sont définis.Vous n'avez donc pas à vous soucier du fait qu'une valeur en dollars que vous saisissez comme 4,58 $ soit enregistrée sous la forme d'une valeur à virgule flottante de 4,5799999999999997.

Ce dont je me souviens, c'est qu'une virgule flottante de 32 bits est stockée en utilisant 24 bits pour un nombre réel, et les 8 bits restants sont utilisés comme puissance de 10, déterminant où se trouve la virgule décimale.

Je suis un peu rouillé sur le sujet cependant...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top