IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

addition type float


Sujet :

C++

  1. #1
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut addition type float
    Bonjour.

    J'utilise le compilateur visual c++ 2008, processeur pentium4.

    Voici une op�ration avec des doubles :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <iostream>
     
    using namespace std;
     
    void main(){
     
      double d1 = 5946100.5;
      double d2 = 5946048.0;
      int iVal = 4000;
     
      double dDelta = d1 - d2;
      dDelta /= (double)iVal;
     
      for(int i = 0; i < 4000; i++)
        d2 += dDelta;
     
      cout << d2;
    }
    A la sortie, d2 = 5946100.4999....;

    Voici la m�me chose avec des flottants :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <iostream>
     
    using namespace std;
     
    void main(){
     
      float f1 = 5946100.5f;
      float f2 = 5946048;
      int iVal = 4000;
     
      float fDelta = f1 - f2;
      fDelta /= (float)iVal;
     
      for(int i = 0; i < 4000; i++)
        f2 += fDelta;
     
      cout << f2;
    }
    A la sortie, f2 = 5946048;

    L'addition ne se fait pas.

    Pouvez-vous me dire ce que je n'ai pas compris avec les nombres flottants.

    PS : mode debug sans optimisation.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Salut

    La r�ponse est tr�s simple, fDelta est trop petit. Je m'explique. En float, tu as 1 bit de signe, 11 bits pour l'exposant et 23 bits pour le nombre, ce qui te donne une pr�cision d'environ 7 � 8 d�cimales apr�s la virgule (en �criture scientifique, bien s�r).

    Maintenant regarde tes nombres :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    f2 =      5946048.0
    fDelta =        0.00000000220735
    fDelta est largement inf�rieur � la valeur minimale possible pour �tre ajout�e � d2. En clair : le processeur doit arrondir fDelta, et il est arrondi � 0,00. Donc 0 tout court, donc rien.

    En double, tu vas aller jusqu'� 16 d�cimales. Donc ton reliquat va bien �tre ajout�, mais je crois que tu perds quand m�me de la valeur avec les chiffres que tu montrent. Ton dDelta va �tre arrondi � plut�t 0,0000000022.

  3. #3
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par d�faut
    Ce que tout informaticien devrait savoir sur les nombres r�els

    Amen.

    @jblecanard: tention que le nbr de d�cimal n'est pas une mesure pertinente. Les r�els ont une repr�sentations qui s'elargit au fur et a mesure que les nombres augmentent. Ca + les d�normaux.

  4. #4
    Expert confirm�

    Inscrit en
    Ao�t 2006
    Messages
    3 967
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 3 967
    Par d�faut
    Dia,
    Citation Envoy� par Joel F Voir le message
    @jblecanard: tention que le nbr de d�cimal n'est pas une mesure pertinente. Les r�els ont une repr�sentations qui s'elargit au fur et a mesure que les nombres augmentent. Ca + les d�normaux.
    Oui, il a parl� de nombre de d�cimales, mais il a manifestement parfaitement compris qu'il s'agit du nombre de chiffres significatifs.

    Reste bien entendu le probl�me de vocabulaire.

  5. #5
    Membre tr�s actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par d�faut
    perso je recherche une doc un peu plus d�taill�e

  6. #6
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    Bonjour.

    Merci pour vos r�ponses. Enfin d�but de r�ponse...

    On ne doit pas avoir la m�me calculette. Disons que la calculette de windows me donne un fDelta de 0,013125. ((5946100.5 - 5946048.0) / 4000).


    Est-ce que cette valeur de fDelta est fausse (j'ai fait une erreur) ?
    Dans le cas o� cette valeur est juste, cela remet-il en cause vos raisonnements ? (qui me semblent pertinents pour une valeur de fDelta de 0.00000000220735 mais pas pour 0,013125).

    Joel F, est-il possible de me r�sumer le lien que tu m'as donn� (pour mon cas pr�cis), qui puisse me permettre de comprendre. Ou bien dois-je lire ce pav�... ?

    PS : habituellement je g�re les nombres r�els � la main. Intuitivement j'avais compris qu'il ne fallait pas faire confiance au processeur... L� je travaille sur un programme o� la pr�cision n'est pas de rigueur. Et je me rends compte que c'est vraiment le bordel...
    J'ai tout r��cris le programme avec des doubles, mais j'aimerai comprendre.

  7. #7
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par d�faut
    Citation Envoy� par moldavi Voir le message
    Joel F, est-il possible de me r�sumer le lien que tu m'as donn� (pour mon cas pr�cis), qui puisse me permettre de comprendre. Ou bien dois-je lire ce pav�... ?
    En gros, les nombres r�els repr�sent� discr�tement ont des comportements contre-intuitifs. Je ne peux que te conseiller de le lire car il apporte �norm�ment de pr�cision sur pas mal de chose.

    Citation Envoy� par moldavi Voir le message
    PS : habituellement je g�re les nombres r�els � la main. Intuitivement j'avais compris qu'il ne fallait pas faire confiance au processeur...
    Non, le processeur fait son travail proprement, le pb vient souvent des d�veloppeurs qui veulent faire des choses qui n'ont pas de sens ou des compilos qui nous jouent des tours en basculant sans nous le dire entre represenation interne 80 bits et representation m�moire 32 bits par le jeu des copies registres/m�moires sur lesquelles ont a peu de controle.

  8. #8
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par moldavi Voir le message
    Joel F, est-il possible de me r�sumer le lien que tu m'as donn� (pour mon cas pr�cis), qui puisse me permettre de comprendre. Ou bien dois-je lire ce pav�... ?
    Je plussoie, si on veut faire des calculs num�riques s�rieux, il vaut mieux lire le pav�...

    Mais si on ne veut pas, juste quelques astuces qui marchent parfois :
    - On stocke les gros volumes de donn�es avec la pr�cision qui a du sens pour elles, mais on fait les calculs dans la pr�cision maximale disponible.
    - Pr�f�rer les calculs directs aux accumulations
    - Faire les calculs en diverse pr�cisions, ou avec une biblioth�que de calcul par intervalles, permet de se faire une id�e si on est dans un cas o� les calculs sont probl�matiques.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  9. #9
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    La premiere chose, c'est de ne pas confondre reels et flottants. Tant qu'on s'imagine que les flottants sont une modelisation suffisemment fidele des reels pour qu'on puisse l'utiliser sans en maitriser les differences, il y aura des problemes.

    Citation Envoy� par guillaume07 Voir le message
    perso je recherche une doc un peu plus d�taill�e
    http://www.springer.com/birkhauser/m...-0-8176-4704-9

    Citation Envoy� par moldavi Voir le message
    Dans le cas o� cette valeur est juste, cela remet-il en cause vos raisonnements ?
    Les float on a peu pres 6 chiffres significatifs. Tu est toujours au dessous de la difference observable.

    Joel F, est-il possible de me r�sumer le lien que tu m'as donn� (pour mon cas pr�cis), qui puisse me permettre de comprendre. Ou bien dois-je lire ce pav�... ?
    Le probleme des resumes, c'est que les gens en sortent des recettes (du genre "il ne faut jamais tester l'egalite deux flottants" ou "les flottants decimaux n'ont pas les problemes des flottants binaires") et le probleme est tel que les recettes simplifient trop le probleme; on tombe facilement dans des cas ou elles ne sont pas applicables si on n'a pas compris leur mode de fonctionnement (il y a des cas ou l'egalite est le test a faire, et de toute maniere l'introduction d'un epsilon rend l'egalite non transitive ce qui n'est pas particulierement intuitif non plus; en fait les flottants decimaux ont quasiment tous les problemes des flottants binaires et quelques uns en plus).

  10. #10
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par JolyLoic Voir le message
    - Faire les calculs en diverse pr�cisions, ou avec une biblioth�que de calcul par intervalles, permet de se faire une id�e si on est dans un cas o� les calculs sont probl�matiques.
    (Changer le mode d'arrondi est une autre technique; pour autant qu'on ait l'infrastructure pour).

    A noter que l'interpretation de ce genre de resultat est delicate -- le probleme pouvant provenir que l'algo est inadapte au calcul par intervalles (celui-ci est tres pessimiste si on ne prend pas les bonne precautions.)

  11. #11
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par d�faut
    Je recommande a tout hasard de jouer avec la biblioth�que CADNA qui utilise un algo assez sioux pour detecter les pb d'arrondi, de cancellation et autre joyeuset�s

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Je voulais bien entendu parler du nombre de chiffres significatifs, merci de m'avoir remis dans le droit chemin du vocabulaire juste .

    Citation Envoy� par moldavi Voir le message
    On ne doit pas avoir la m�me calculette. Disons que la calculette de windows me donne un fDelta de 0,013125. ((5946100.5 - 5946048.0) / 4000).
    La calculette de windows travaille tr�s certainement avec un mod�le de donn�es encore plus pr�cis. Moi, j'ai fais le calcul avec C++, le r�sultat est donc tronqu�.

  13. #13
    Expert confirm�

    Inscrit en
    Ao�t 2006
    Messages
    3 967
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 3 967
    Par d�faut
    Soa,

    Oui, la calculette Windows calcule avec environ 32 chiffres significatifs, soit environ 2 fois plus qu'avec le type double habituel.

  14. #14
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Meme en faisant le calcul en float on arrive a 13 millieme. jblecanard a du faire une typo quelque part.

  15. #15
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    Bonjour.

    Merci pour ces r�ponses. A tout compris maintenant. En fait, plus il y a de nombres devant la virgule et moins il y a de nombres derri�re la virgule... Je pensais que la mantisse figeait le nombre de chiffre significatif derri�re la virgule.
    Mea Culpa... A pas bien suivi les cours.

    Comme je l'ai dit la pr�cision n'a pas d'importance pour le programme sur lequel je travaille. Mais l'addition doit se faire quand m�me...


    PS : � Joel F. Je lirai ce pav� le jour o� cela deviendra primordial. J'ai conserv� le lien, je ne doute pas qu'un jour j'en aurai besoin. J'ai une dizaine de pav� � lire avant...

    A JolyLoic : la premi�re remarque est tr�s pertinente, je vais certainement l'appliquer.

    "Pr�f�rer les calculs directs aux accumulations", l� je ne comprends pas le sens de cette phrase.

  16. #16
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par JolyLoic Voir le message
    Mais si on ne veut pas, juste quelques astuces qui marchent parfois :
    - On stocke les gros volumes de donn�es avec la pr�cision qui a du sens pour elles, mais on fait les calculs dans la pr�cision maximale disponible.
    - Pr�f�rer les calculs directs aux accumulations

    - Faire les calculs en diverse pr�cisions, ou avec une biblioth�que de calcul par intervalles, permet de se faire une id�e si on est dans un cas o� les calculs sont probl�matiques.
    Citation Envoy� par moldavi Voir le message
    Merci pour ces r�ponses. A tout compris maintenant. En fait, plus il y a de nombres devant la virgule et moins il y a de nombres derri�re la virgule...
    Gagn�. Avec des float tu as 6 chiffres, avec des doubles 15.

    Comme je l'ai dit la pr�cision n'a pas d'importance pour le programme sur lequel je travaille. Mais l'addition doit se faire quand m�me...
    Loic te donnait deux solutions. Je les ai mises en gras.

    PS : � Joel F. Je lirai ce pav� le jour o� cela deviendra primordial. J'ai conserv� le lien, je ne doute pas qu'un jour j'en aurai besoin. J'ai une dizaine de pav� � lire avant...
    Je continue � pense que la compr�hension devrait en �tre indispensable avant d'�tre autoris� � utiliser les types flottants.

  17. #17
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    Re.

    A Jean-Marc.Bourguet.

    C'est rigolo, j'�tais justement en train de tenir compte des id�es de JolyLoic, et j'ai modifi� mon message alors que tu me donnais une r�ponse.

  18. #18
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par moldavi Voir le message
    "Pr�f�rer les calculs directs aux accumulations", l� je ne comprends pas le sens de cette phrase.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
      for(int i = 0; i < 4000; i++)
        d2 += dDelta;
    � remplacer par

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    for (int i = 0; i < 4000; ++i)
       t = d2+i*dDelta;

  19. #19
    Inactif  

    Homme Profil pro
    Ing�nieur test de performance
    Inscrit en
    D�cembre 2003
    Messages
    1 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur test de performance
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 986
    Par d�faut
    OK.

    Merci pour tout, et je vous rassure, j'approfondirai le sujet, pav� o� pas...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [type float ] probl�me d'affichage
    Par you98 dans le forum MS SQL Server
    R�ponses: 1
    Dernier message: 14/11/2005, 08h06
  2. Pr�cision du type float
    Par cj227854 dans le forum C
    R�ponses: 5
    Dernier message: 02/11/2005, 20h54
  3. ins�rer une valeur de type float dans une abse de donn�es
    Par Stephane_br dans le forum Langage SQL
    R�ponses: 2
    Dernier message: 02/11/2005, 10h47
  4. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    R�ponses: 9
    Dernier message: 05/05/2005, 12h37
  5. [MS-SQL][ADO] pr�cision du type FLOAT
    Par Le L�zard dans le forum Bases de donn�es
    R�ponses: 2
    Dernier message: 23/09/2004, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo