From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Comparaison de 2 valeurs numérique

Bonjour à tous,

 

Je ne comprends pas le fonctionnement de mon vi, pourtant très simple. Le problème apparait lorsque je définis une valeur au millième près. Donc voici les actions que je fais pour aller de la situation normale à la situation anormale :

1 - j'ouvre le fichier bug comparaison.vi

2 - j'exécute le vi ==> le booléen est TRUE

3 - je définis x à 1,251 ==> le booléen est FALSE

4 - avec la molette de la souris j'incrémente la valeur de x jusqu'à 1,26

5 - ensuite, je décrémente à 1,25 ==> le booléen reste à FALSE, alors qu'il devrait passer à TRUE.

 

Sur mon PC j'ai essayé avec LV 2016 et LV 2015. Sur un autre PC j'ai essayé avec LV2017. Dans les 3 cas j'observe le même comportement, et je ne comprends pas pourquoi.

 

J'ai la désagréable sensation d'être passé à côté de quelque chose. Pouvez-vous éclairer ma lanterne SVP, ou confirmer que j'ai mis le doigt sur un vrai bug ?

 

Merci d'avance.

Quentin

 

Tout télécharger
0 Compliments
Message 1 sur 5
2 562 Visites

So sorry for answering in English. My French is terrible (Google translated it very well though).

 

Comparing floats  for equality is a big no-no in any programming language (Google). The few digits that are shown are just the rounded values. There will be small changes, maybe 10 digits behind the shown value.

 

Multiply by 1000, then round to integer. Compare the integers.

Or use in range and course.

Or subtract the floats, take the absolute value and compare if it's smaller\bigger then a limit.

0 Compliments
Message 2 sur 5
2 559 Visites

wiebe@CARYA wrote:

 

Or subtract the floats, take the absolute value and compare if it's smaller\bigger then a limit.


This last suggestion is the one you should choose.  Note that if you need to do a lot of such "comparison of Floats", you may want to write a sub-VI, "Float Equals", that takes three parameters -- your two values (call them X and Y) and a "delta" that you initialize with a suitable default value, say 0.00001 ("Initialize" means you write this value in the Control of the sub-VI, then select it, go to the Edit Menu, and choose "Use Selected as Default" -- this allows you to call the sub-VI without specifying this value and have it use the, now-non-zero, Default).  Your VI code is simple -- subtract X and Y, take absolute value, and return the value of the Comparison abs(X-Y) < delta.

 

If you are really adventurous, you might write an additional "Relative Float Equals" routine that computes abs(X-Y)/(abs(X)+abs(Y)) to allow for arguments that are very small (maybe even smaller than the default Delta) or very big (where tiny fractional differences are silly).  Here the only "gotcha" is to make sure the denominator isn't 0 (and if it is, then X = Y, right?).

 

Bob Schor

0 Compliments
Message 3 sur 5
2 532 Visites

Il n'est pas possible de représenter un DBL (un nombre à virgule flottante) avec une précision supérieure à 1/(2^52) , soit Epsilon. Cela est intrinsèque à la façon dont les nombres réels sont représentés dans nos PC. Donc ... ton "1,25" a peut de chance d'être parfaitement égal à "un autre 1,25". Regarde  ici  (le "post solution") , tu y trouveras une explication concernant la représentation d'un DBL, et l'origine de cette erreur minimum inévitable qu'est Epsilon.

0 Compliments
Message 4 sur 5
2 503 Visites

Merci pour ces éclaircissements, je vais appliquer ces bonnes pratiques de codage. En fonction du contexte, j'adopterai l'une ou l'autre solution.

0 Compliments
Message 5 sur 5
2 447 Visites