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 :

Différence de résultat entre x86 et x64


Sujet :

C++

  1. #21
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Bonsoir à tous,
    l'analyse avec dr memory m'a donné 0 erreurs, il ne s'agit donc pas d'une erreur mémoire,
    en fait puisque je fais des multiplications matricielles sur différentes itérations, l'erreur état minime puis s'accumule jusqu'à ce quelle devienne grande
    vos avis svp?

  2. #22
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Il a donc trouvé 0 erreurs, cela ne veut pas dire qu'il y a 0 erreurs.
    Vous avez donc un problème de stabilité numérique, comme toujours avec des nombres à virgule flottantes, quand on y va la fleur au fusil.
    Et un problème de stabilité numérique, c'est un bug, et un bug que "dr memory" n'est pas près de détecté, c'est pas son taf.

  3. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Par défaut, Visual Studio est en mode Précis et non en mode Strict.
    Tu peux essayer de compiler ton projet en mode Strict, et là ça ne devrait pas varier.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #24
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    C'est ce que je disait dès le début, il s'agit d'un problème avec les doubles, me je ne sais pas quoi exactement
    en fait pour mon code il s'agit d'opérations simples
    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
     
     
    r = sqrt(x*x+y*y);  
    n1 = x/r;
    n2 = y/r;
    er = r-radius;
     
    r2 = sqrt(er*er+z*z); ;
    n21 = er/r2;
    n22 = z/r2;
    xsi = r2 - radius2;
     
    sxsi += (xsi*xsi);
     
    myfile << nb_interation << "\t" << j << "\t" << r << "\t" << er << "\t" << r2 << "\t" << xsi << "\t" << sxsi << endl;
    ce traitement s'effectue dans deux boucles imbriquées

    J'ai enregistré les étapes de calcul dans un fichier et j'ai comparé les résultats, les différences commencent minimes, mais après ça change complètement

    Nom : .PNG
Affichages : 305
Taille : 64,3 KoNom : C2e.PNG
Affichages : 314
Taille : 62,3 Ko

    Vos avis svp?

    Merci

  5. #25
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    il s'agit d'opérations simples
    Des racines carrées, des divisions avec des opérandes potentiellement pas du même ordre de grandeur, somme cumulative d'un carré d'un résultat intermédiaire (sans compter que "radius2", on sait pas s'il est initialisé), vous avez une définition du simple d'un point de vue stabilité numérique assez lâche.
    La solution de @Médinoc donne quoi ?

  6. #26
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    radius2 est initialisée

    La solution de Médinoc n'a rien changée

  7. #27
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Projet minimal permettant de refaire ces constatations SVP.

  8. #28
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    J'ajoute qu'il faut se méfier de l'affichage.
    Il n'est pas complètement exclu que ce soit uniquement l'affichage qui diffère.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #29
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Exact, c'est pour ça qu'une bonne comparaison se fait sur le binaire et non sur un affichage en digits fait par on ne sait quelle méthode qui peut se permettre on ne sait quels arrondis pour y parvenir.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #30
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par ternel Voir le message
    J'ajoute qu'il faut se méfier de l'affichage.
    Il n'est pas complètement exclu que ce soit uniquement l'affichage qui diffère.
    Non, ce n'est pas une histoire d'affichage parce que à la fin du calcul la différence devienne grande

    Citation Envoyé par bacelar Voir le message
    Des racines carrées, des divisions avec des opérandes potentiellement pas du même ordre de grandeur, somme cumulative d'un carré d'un résultat intermédiaire (sans compter que "radius2", on sait pas s'il est initialisé), vous avez une définition du simple d'un point de vue stabilité numérique assez lâche.
    La solution de @Médinoc donne quoi ?
    Et alors? ça explique la grande différence des résultats en 64 et en 32 bits? Normalement un traitement doit être le même quelque soit la plateforme!

  11. #31
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Oui, tu as raison. Il ne devrait pas y avoir de différence.
    Et puisqu'il y en a quand même une, c'est qu'il y a une erreur dans ton code et tu devrais la trouver.

    On peut juste t'orienter vers des pistes de réflexion (à moins que tu nous fournisses un code minimal, comme demander par @bacelar, afin que l'on puisse reproduire les différences que tu observes).

    Pour la petite histoire, j'ai moi-même récemment modifié un code qui fonctionnait bien en 32 et en 64 bits avant modification.
    Avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline int compare(unsigned int l, unsigned int r)
    {
    	return int(l - r);
    }
    Après, le résultat n'est plus celui espéré en 64 bits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline intptr_t compare(unsigned int l, unsigned int r)
    {
    	return intptr_t(l - r);
    }
    En 64bits, sachant que sous windows un unsigned int reste en 32bits, le résultat sera toujours >0.
    Je l'ai corrigé comme ceci (en généralisant au passage):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<typename T>
    constexpr std::enable_if_t<
    	std::is_integral<T>::value && (sizeof(T) <= sizeof(intptr_t)),
    	intptr_t> compare(T l, T r) noexcept
    {
    	return intptr_t(std::make_signed_t<T>(l - r));
    }
    En bref, vérifie bien tous les cast éventuels, implicites ou explicites, en plus des autres pistes déjà suggérées.

  12. #32
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    ça explique la grande différence des résultats
    Oui parce qu'à chaque opération des arrondis sont effectués. Plus d'opérations il y a, plus d'erreurs il y a. C'est la surenchère à la violence dès que le moindre bit diffère.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #33
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Après un retard qui est dû à une panne technique, je suis de retour
    J'ai mis une version du projet sur le quel j'ai travaillé
    Je ne trouve ps encore la source du problème Compute.zip

  14. #34
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    La solution ne compile pas sur ma machine (Windows 7 64 bits, VS 2013)

    Nom : Capture.PNG
Affichages : 203
Taille : 30,8 Ko

  15. #35
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Ça ressemble hélas un grand classique windows...
    Défini la macro NOMINMAX afin d'éviter que l'inclusion de windows.h ne vienne foutre la grouille dans le programme.

    Si ce n'est pas ça, peut-être manque-t-il juste un #include <algorithm>
    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.

  16. #36
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    C'est un projet VS2012.
    J'ai testé avec un Sevent 64bits, VS2012 Express.

    Résultats :
    Debug Win32 via débogueur: Une Exception ligne 249 de GSolve.cpp. C'est dans un constructeur.
    -> L'objet est "Invalide".
    Sortie du programme :
    radius2 -1.#INF
    radius -1.#IND
    ItÚration 0
    radius2 1.#INF
    radius -1.#IND

    Defined -2
    Debug Win32 sans débogueur: Crash violnt.

    Release Win32 via débogueur: Même exception quand Debug Win32, puis d'autre en boucles, jusqu'à une sortie via GPF en boucle.
    Release Win32 sans débogueur: Crash violnt.


    Debug x64 via débogueur: même chose que Win32
    Debug x64 sans débogueur: Crash violnt.

    Release x64 via débogueur: Même exception quand Debug Win32.
    Release x64 sans débogueur: Crash violnt.

    EDIT: ;-°

  17. #37
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Crash violant.
    je sais pas si c'est une erreur de frappe, mais ça doit faire mal à l'ordinateur.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  18. #38
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai tenté de jeter un œil au code source, rien que dans la classe GVector il y a des trucs bien suspects, à commencer par le fait qu'il soit publiquement 1-indexé, mais aussi des horreurs comme le desallocGVector() qui est public et ne remet pas le pointeur à zéro après désallocation, le getVector() également public qui ne vérifie pas que le vecteur en entrée est suffisamment grand, l'opérateur = qui n'utilise pas le copy-and-swap (pas plus que les autres opérateurs assignants), l'opérateur ! qui non seulement est défini, mais duplique le code de getNorm() au lieu de l'appeler, et la gestion bizarre de la division par zéro.

    J'ai peur de m'aventurer dans les autres fichiers...

    Edit: Oh, et pour la rigolade, le header inclut le vrai <vector> sans raison...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #39
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par bacelar Voir le message
    C'est un projet VS2012.
    J'ai testé avec un Sevent 64bits, VS2012 Express.

    Résultats :
    Debug Win32 via débogueur: Une Exception ligne 249 de GSolve.cpp. C'est dans un constructeur.
    -> L'objet est "Invalide".
    Sortie du programme :
    Je confirme, c'est un projet VS 2012
    c'est bizarre!!!, je n'aurai pas ces exceptions, mais je trouve des résultats différents en 32 et en 64 bits

    en 32 bits Debug
    Itération 60
    radius2 12.0686
    radius 0.974234
    _best_score 33.951
    _best_vector
    -0.571505
    0.820599
    -0.000649084
    en 32 bits Release
    ItÚration 60
    radius2 12.4158
    radius 0.0285115
    _best_score 574361
    _best_vector
    -0.468735
    -0.269469
    -0.841233
    en 64 bits Debug
    ItÚration 60
    radius2 12.426
    radius 0.0282537
    _best_score 605926
    _best_vector
    0.473728
    0.876396
    0.0866695
    en 64 bits Release
    ItÚration 60
    radius2 12.426
    radius 0.0282537
    _best_score 605926
    _best_vector
    0.473728
    0.876396
    0.0866695
    Le résultat est le même pour l'exécution 64 release ou debug, mais en 32 bits c'est différent
    Une explication svp?

  20. #40
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 391
    Points
    11 391
    Billets dans le blog
    11
    Par défaut
    C'est quand même étrange que tu aies des différences de résultat entre debug et release, en 32 bits, ça pue, ça.
    Tu n'aurais pas des différences d'options de compilation, entre les 2 modes?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/07/2010, 10h27
  2. [AC-2000] Différence de résultat entre acpreview et Print d'un état
    Par riri2938 dans le forum IHM
    Réponses: 0
    Dernier message: 20/02/2010, 15h50
  3. [Débutant] Différences de résultats entre MATLAB 6.5 et 7.8
    Par Caps59 dans le forum MATLAB
    Réponses: 21
    Dernier message: 16/03/2009, 15h04
  4. Différence de résultat entre MATLAB et Scilab
    Par ABN84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/05/2008, 22h53
  5. Différence de résultats entre requêtes SQL et Criteria
    Par titoudemtl dans le forum Hibernate
    Réponses: 3
    Dernier message: 07/08/2006, 09h30

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