Résultats de 1 à 10 sur 10

Sujet : Comparer des double/float

  1. #1
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    Salut,

    je cherche à trouver un petit code qui me permettrait de trouver l\'intervalle de tolèrance qu\'il existe entre deux double ou deux float.

    Je m\'explique, si on fait
    Code:
    double a;
    a = 0.01;
    if (a == 0.01)
    On retrouvera surement foux car les doubles et float sont arrondis.

    Ainsi il faut coder comme ca
    Code:
    if (abs(a-0.01) < 0.000001)
    Mais je voudrais savoir comment trouver une valeur de 0.000001 car elle change suivant la machine.

    Merci,
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  2. #2
    Membre MP
    Inscrit
    août 2013
    Messages
    665
    Bon en fait, un float est codé comme ca(dans la norme IEEE 754, j\'adoreu ce nom-eu) :
    S | E | M
    S : Signe
    E : Exposant
    M : Mantisse
    Pour S, si c\'est 0 c\'est un nombre positif, sinon 1, donc S est codé sur 1 bit.
    Dans le cas de la norme que j\'ai cité, je crois que E prend 8 bits et la mantisse 23.
    Dans la plupart des cas, on prend une mantisse normalisée, c\'est à dire qu\'on essaye de mettre sous la forme scientique le flottant en binaire (en fait plutôt 1 chiffre juste après la virgule et non pas avant, c\'est pas exactement pareil que la notation scientifique) et on récupère l\'exposant auquel on ajoute (2^8 - 1)/2 (pour pouvoir avoir des exposants négatifs codés sous une forme positive). Bon c\'est pas très clair, mais bon...
    En tout cas tout ca pour dire que la norme IEEE 754 est codée sur 4 octets (et je crois que c\'est celle utilisée en C), et que (2^8 - 1) / 2 = 127 donc tu peux aller avec un float normal jusqu\'à 10^-127 avec 23 bits significatifs binaires (mantisse). 2^23 = > 8 . 10^6 . Un double est stocké sur 8 octets.
    Conclusion : Les doubles et float seront assez précis pour ton exemple, à mon avis. :lol: Sinon faut faire la différence entre le nombre variant et la constante et tester si c\'est inférieur à un certain nombre.
    [col=#FFDD1A]( [/col][col=#FF0000]B[/col]e [col=#FF0000]S[/col]i[col=#FF0000]d[/col]e [col=#FFDD1A])[/col]

  3. #3
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    Merci Jis pour ces explications très scientifiques, mais si je me rappelle bien mon prof, il ne sont pas codés sur le même nombre de bits suivant la machine sur laquelle on bosse.

    Il y a bien un ou deux fichiers ou on peut les retrouver mais je ne me rappelle plus lesquels.

    En fait, en utilisant un sizeof(float), on peut récup le nombre d\'octets utilisés, puis trouver une formule pour faire l\'épsilon.
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  4. #4
    Membre MP
    Inscrit
    août 2013
    Messages
    627

    Comparer des double/float

    Ca a rien a voir avec big ou little endian? le bit de poid fort passe du debut a la fin.

    rien a voir ou si?

    j avais fait ca pour savoir :
    Code:
    /* return 1 for Little Endian and 0 for Big Endian*/
    union           u_endian
    {
      int           value;
      char          val[4];
    }               u;
    int             endian()
    {
      u.value = 1;
      return(u.val[0])
    }
    ... Until then, we're better off dead
    A smile on the lips and a hole in the head ...

  5. #5
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    Sésolé Nothing mais la je suis assez perdu.

    J\'ai pas l\'habitude d\'utiliser les union.
    Tu veux pas expliquer un peu ?

    De plus je ne vois pas le rapport avec l\'endian.
    (dans la ville lol fô que j\'arrête les jeux de mots à 2 balles lol).
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  6. #6
    Membre MP
    Inscrit
    août 2013
    Messages
    665
    Moi aussi, tout ce que je sais, je l\'ai dit. :lol: J\'aimerais bien approfondir un peu.
    [col=#FFDD1A]( [/col][col=#FF0000]B[/col]e [col=#FF0000]S[/col]i[col=#FF0000]d[/col]e [col=#FFDD1A])[/col]

  7. #7
    Membre MP
    Inscrit
    août 2013
    Messages
    627
    Ben nan mais en fait c est plus pour le reseau.
    Suivant l architecture on est en big ou little endian. Tout est code de facon inverse.
    sur une architecture: 00000001
    sur l autre: 1000000
    c est chiant quand on fait du reseau.

    l union c est qu en fait tu partage une zone memoire avec plusieurs variables.

    tu met un int (4 octets) et un char[4] (4 octets aussi).
    ca te permet de voir ou ce situ le bit de point fort.
    je sais pas si c est tres clair,
    ... Until then, we're better off dead
    A smile on the lips and a hole in the head ...

  8. #8
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    Dac je comprends mieux,

    j\'ai déjà vu des trucs sur les big et little endian sans jamais y toucher encore.
    A ce qu\'en ai tiré c\'est une méthode pour coder des nombres casi-infinis.

    Pour union, ok aussi.

    Par contre pour le rapport avec le sujet. Je vois moins la.
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  9. #9
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    lol vraiment la mort de rire complet.

    Je faisais des recherches sur Google sur une norme IEEE pour un problème de doubles.

    Et en cliquant sur un lien je vois dans le descriptif en une fraction de seconde une phrase de Jis qui \'tu sais pac ca doit ...\'

    Et me voici ici, mdr.
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  10. #10
    Membre MP
    Inscrit
    août 2013
    Messages
    665
    arhhh :lol:
    [col=#FFDD1A]( [/col][col=#FF0000]B[/col]e [col=#FF0000]S[/col]i[col=#FF0000]d[/col]e [col=#FFDD1A])[/col]

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé