Discussions au sujet de NI LabVIEW

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

Curieux !!! Arrondi Addition

Résolu !
Accéder à la solution

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.

Message 21 sur 39
4 037 Visites

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

Antoine Chalons

Message 22 sur 39
4 037 Visites

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

Antoine Chalons

Message 23 sur 39
4 034 Visites

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.

 

 

 

 

Message 24 sur 39
4 022 Visites
Solution
Accepté par Michael.C

ok, compris.  Smiley heureux

 

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.

 

 

yyyyyy.png

Message 25 sur 39
4 000 Visites

salut ouadji, bravo clair et net. bonne journée A+

banniere Luc Livre NXG Champion.png

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

0 Compliments
Message 26 sur 39
3 986 Visites

très pédagogique Smiley heureux

Merci

0 Compliments
Message 27 sur 39
3 963 Visites

Super exemple. Merci Ouadji!

Sabri JATLAOUI - Certified LabVIEW Architect - Certified LabVIEW Developer
0 Compliments
Message 28 sur 39
3 736 Visites

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 😞

 

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
0 Compliments
Message 29 sur 39
3 623 Visites

Capture.JPG

comment un I32 peut avoir des chiffres après la virgule ? Smiley surpris

0 Compliments
Message 30 sur 39
3 616 Visites