le 03-31-2016 12:04 PM
Vous êtes tous des LabVIEWpathes.
Tous vos problèmes trouvent réponse dans le premier (excellent) lien que ouadji a mentionné en page1 (les pages 3 et 5 du pdf étant pour moi les plus essentielles). Il n'est pas question avec une virgule flottante de savoir si un nombre tient avec précision dans 64 bits mais s'il est exact dans sa représentation {mantisse-exposant}, ce qui n'est pas possible pour des données trop petites ou grandes.
++
Eric M. - Senior Software Engineer
Certified LabVIEW Architect - Certified LabVIEW Embedded Systems Developer - Certified LabWindows™/CVI Developer
Neosoft Technologies inc.
le 03-31-2016 12:09 PM
c'est marrant, chaque année je fais de TP d'intro à LabVIEW à Polytech'Annecy et c'est exactement le sujet du premier TP.
Comprendre qu'en float 3*34.4 n'est pas toujours égal 102.2
Tu peux télécharger le repo sur https://github.com/LabVIEW-at-Polytech/Conf et regarder le TP1
We have two ears and one mouth so that we can listen twice as much as we speak.
Epictetus
03-31-2016 12:13 PM - modifié 03-31-2016 12:14 PM
et le post original qui date de 2006 😮
http://forums.ni.com/t5/LabVIEW/SGL-equality/m-p/307310#M159625
on tourne en rond les gars!
We have two ears and one mouth so that we can listen twice as much as we speak.
Epictetus
le 03-31-2016 02:04 PM
Intéressant TiTou ton cast vers un array de bytes.
N'ayant jamais eu réellement besoin des nombres à virgule flottante, je n'ai jamais réellement étudié le sujet en profondeur.
Autodidacte, je n'étudie que les sujets auxquels je suis confronté et dont j'ai besoin. Je n'ai jamais eu besoin d'un float en assembleur (ni avec LV)
C'est une lacune de culture générale ... je vais remédier à ça. Je reviendrai éventuellement sur le sujet quand j'aurai comblé cette lacune.
cedi étant dit, ma question (étonnement de comportement) concernant la fonction "Machine Epsilon" reste entière.
03-31-2016 08:17 PM - modifié 03-31-2016 08:32 PM
ok, compris.
ceci simplement à destination de ceux que cela intéresse, et qui comme moi,
n'avaient jamais réellement creusé le sujet ... rien de plus.
ci-joint un petit VI pour "voir" comment se code et se comporte un float.
si on joue avec ce VI on voit très bien ce qui se passe.
(il faut chercher un peu, "jouer" avec le VI, analyser ce que l'on voit ... avec à côté de soi une doc sur la norme IEEE754)
un exemple qui résume tout :
Prenez un DBL et introduisez le nombre : 1,123456789123456 (placez "digits of precision" à 18)
Votre DBL n'affichera jamais le nombre introduit ... il affichera : 1,12345678912345592
Pourquoi ? Tous simplement parceque la représentation de 1,123456789123456 ... n'existe pas !
Ce sera soit 1,12345678912345592 ... soit ... 1,12345678912345614 , mais rien n'est possible entre les deux.
(et la 1ere valeur est la plus proche)
Exactement 1,123456789123456 ... c'est impossible! Pourquoi?
Je n'explique pas en détail, juste le "principe" ... voir la doc sur la norme IEEE754, il y a des doc très bien faites)
Un float est composé d'un signe, d'un exposant et d'une mantisse. Le soucis vient du fait que cette mantisse est limitée à 52 bits.
Cette mantisse est un nombre fractionnaire en base 2 ... on va donc être limité par la plus petite valeur que l'on peut représenter avec cette mantisse.
Cette plus petite valeur est 1/(2^52) (en gros 2,22E-16).
Un float se représente donc avec un "quantum" minimum de 2,22E-16
Il est donc impossible de représenter (dans notre PC) le nombre 1,123456789123456 de façon exacte (avec un float sur 64 bits)
Ce sera un rien au dessus, ou un rien en dessous ... en concordance avec "le pas" minimum.
Il est impossible avec un float de représenter la totalité des nombres réels.
Et ce pas minimum, 1/(2^52) c'est Epsilon, la constante donnée par la fonction "Machine Epsilon".
La constante Epsilon permet de mettre en évidence l'égalité (ou non) entre 2 float.
Cette constante Epsilon est la constante d'erreur "de base". Elle devra être ajustée en fonction de la grandeur des nombres qui sont traités.
(ici, j'ai ma réponse à ma dernière question concernant Epsilon)
Je reconseille cette doc (en page 4 et 5) on y explique l'utilisation de cette constante, cette doc est fort bien faite.
Voila, un rien d'attention permet de comprendre le codage, le fonctionnement, et surtout, les "limites" d'utilisation d'un float.
le 04-01-2016 02:50 AM
salut ouadji, bravo clair et net. bonne journée A+
Luc Desruelle | Mon profil | Mon blog LabVIEW | Auteur livre LabVIEW : Programmation et applications - G Web
Certified LabVIEW Architect (CLA) & Certified TestStand Developper (CTD) | LabVIEW Champion
MESULOG - LinkedIn site | NERYS - NERYS Group
| directeur CEO MESULOG
| CODIR - NERYS group
le 04-01-2016 04:51 AM
très pédagogique
Merci
le 04-15-2016 03:42 AM
Super exemple. Merci Ouadji!
le 05-12-2016 08:13 AM
Aller Ouadji,
Un petit défi sur ce sujet pour toi.
Voici une représentation simplifiée d'une partie de mon programme.
Comment je fais pour qu'une incrémentation de 1, arrête de me sortie des résultats avec x,999999 😞
le 05-12-2016 09:56 AM
comment un I32 peut avoir des chiffres après la virgule ?