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. #1
    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 Différence de résultat entre x86 et x64
    Bonjour,
    J'ai crée un projet console c++ qui effectue des traitements de calculs avec des doubles puis j'affiche les résultats sur la console, tout va bien jusqu'au jour où j'ai décidé de convertir mon projet en 64 bits. J'ai modifié la machine cible et la configuration du projet et j'ai générée mais les résultats étaient différents de la version 32 sachant que j'ai rien modifié dans le traitement.

    Avez vous une explication? et comment je peux résoudre mon problème svp?
    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    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 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Le plus probable, c'est que c'est un bug latent qui a été mis en évidence par ce changement de configuration.
    Donc, on le règle comme n'importe quel bug, en déboguant et en vérifiant où ça part en sucette, avec un débogueur.

  3. #3
    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
    Je vour remercie pour la réponse, mais je ne vois comment le changement de configuration donne un bug?

  4. #4
    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
    Je pense que bacelar veut dire que le bug est déjà là dans la version x86. Il reste à le mettre en évidence.

  5. #5
    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
    Ou le bug vient d'un implementation defined behavior ou undefined behavior qui ne pose pas de problème en x86 mais qui en pose en x64.

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,

    L'expérience montre que c'est assez souvent dû à un problème de taille pour les types, le cas le plus fréquent étant d'assimiler la taille d'un int et d'un pointeur, ce qui est vrai en x86, mais plus en x64.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    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 518
    Points
    41 518
    Par défaut
    Également supposer qu'un int a la même taille qu'un long, ce qui était vrai en x86 32 bits, mais n'est vrai que sur certaines plate-formes x64 (comme Windows) et faux sur d'autres (comme Linux).
    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.

  8. #8
    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
    Oui je pense que l'erreur vient de la différence de présentation des doubles en x86 et x64 , mais comment je peux résoudre mon problème?
    Je vous remercie pour votre interaction

  9. #9
    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 Bktero Voir le message
    Ou le bug vient d'un implementation defined behavior ou undefined behavior qui ne pose pas de problème en x86 mais qui en pose en x64.
    Est ce que vous pouvez m'expliquer encore svp?

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Moi, je conseillerai l'utilisation d'un débogueur (comme expliqué ici), ou d'un analyseur mémoire (comme Dr Memory).
    Bref, je conseille comme les autres, y a plus qu'à !
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    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
    Citation Envoyé par 3aychoucha Voir le message
    Est ce que vous pouvez m'expliquer encore svp?
    Edit : comme le fait remarquer Danny-k dans un message suivant, je voulais ici parler de la taille de longet non de la taille de int. Le paragraphe suivant a été modifié suite à son commentaire.

    Un exemple simple, en suite avec celui de Médinoc : la taille de long n'est pas figée en C. La norme te garantit seulement que sizeof(long) >= 4. C'est un implementation defined behavior, un "comportement dépendant de l'implémentation" en français. Sur x86, la plupart voire toutes les implémentations (comprendre : les différents compilateurs pour x86) on fait le choix que sizeof(long) serait égale à 4. Or, la plupart des implémentations sur x64 ont décidé que ce serait égale à 8. Quand tu as fait ton programme, tu t'es peut-être basé sur une hypothèse telle que sizeof(long) == 4. Sauf que c'est hypothèse n'est plus vraie en x64 et donc ton programme ne fonctionne pas de la même manière.

    Les undefined behaviors sont beaucoup plus grave : ce sont des "comportements indéfinis". Ce n'est même pas laissé au choix de l'implémentation, ce sont des choses qu'il ne faut pas faire. Exemple : diviser par 0.
    Lire à ce sujet :
    - https://en.wikipedia.org/wiki/Undefined_behavior
    - http://blog.llvm.org/2011/05/what-ev...ould-know.html

    Citation Envoyé par 3aychoucha Voir le message
    Oui je pense que l'erreur vient de la différence de présentation des doubles en x86 et x64 , mais comment je peux résoudre mon problème?
    Je vous remercie pour votre interaction
    Qu'est ce qui te fait dire ça ? Peut-on voir le code ?

    Citation Envoyé par LittleWhite Voir le message
    Moi, je conseillerai l'utilisation d'un [...] analyseur mémoire (comme Dr Memory).
    comme expliqué ici http://www.developpez.net/forums/d12...ows-and-linux/

    Autre conseil : activer les options de warnings de ton compilateur ! Avec gcc ou clang, ce sont -Wall -Wextra.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    tu peux essayer de faire une exemple minimum qui montre le problème

  13. #13
    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 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    On a toujours pas vu de code
    J'ai toujours vu des doubles de 64 bits, en 32 ou 64 bits.
    La dernière fois que j'ai entendu quelqu'un se plaindre de la taille d'un double.. c'était accompagné de reinterpert_cast n'ayant aucun sens.
    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.

  14. #14
    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
    Bktero: Qu'est ce qui te fait dire ça ? Peut-on voir le code ?

    Je récupère les inputs à partir d'un fichier qui contient un ensemble de points pour faire un calcul de filtrage
    j'ai remarqué que le résultat change lorsque je modifie le nombre de chiffres après la virgule,

    Je vais essayer de déboguer pour voir le comportement,

    Merci

  15. #15
    Membre actif
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    Citation Envoyé par Bktero Voir le message
    les différents compilateurs pour x86) on fait le choix que sizeof(int) serait égale à 4. Or, la plupart des implémentations sur x64 ont décidé que ce serait égale à 8.
    Euh, à ma connaissance sur la plupart des OS (Windows, Linux) la taille d'un int sur x86 ou x64 (on va mettre à part les systèmes embarqués et autre où le int peut valoir 16 bits), est en grand majorité codé sur un DWORD de 32bits soit 4 octets, c'est le sizeof(long) qui est différent sous linux (pas sous Windows comme dit plus haut par Médinoc) qui lui vaut 8 octets en x64 et 4 en x86.
    Sera vrai dans à peu près 99% des cas rencontré, que ce soit en 32bits ou 64 bits.

  16. #16
    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
    Tu as tout à fait raison, je ne devais pas être réveillé !

    J'ai modifié mon message...

  17. #17
    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
    3aychoucha, sur quelle plateforme developpes-tu ?
    Si c'est sous windows, il me semble que tous les types de base sont de même taille sauf size_t, et les pointeurs bien sûr (avec les assimilables comme intptr_t par exemple).

  18. #18
    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
    Bonjour à tous,
    Si on veut être précis, sizeof retourne le ratio entre la taille d'un type donné et la taille d'un char.

    le nombre concret de bits d'un char n'est pas définie par le standard.
    CHAR_BIT (défini dans <climits>) indique le nombre de bits d'un char.

    Il est valable (quoique rarrissime) que sur une architecture 64bits, un char fasse 64bits, et qu'ainsi, sizeof(char) == sizeof(short) == sizeof(long) == 1.

    les types ont tous une taille multiple de celle de char (sizeof() n'a pas besoin d'arrondir), les types primitifs sont ordonnés dans leurs tailles (char, short, int, long, long long)
    les types primitifs sont contraints de pouvoir représenter au moins une certaine plage.

    Dans l'explication de Bktero, "La norme te garantit seulement que sizeof(long) >= 4" n'est pas vraie au sens de la norme.
    C'est juste très, très fréquent, puisque CHAR_BIT=8 partout ou presque.
    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

  19. #19
    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
    Citation Envoyé par ternel Voir le message
    Dans l'explication de Bktero, "La norme te garantit seulement que sizeof(long) >= 4" n'est pas vraie au sens de la norme.
    C'est juste très, très fréquent, puisque CHAR_BIT=8 partout ou presque.
    Je ne m'étais jamais fait la remarque (en tout cas pas aussi clairement) mais c'est tout à fait exact !!!

  20. #20
    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 camboui Voir le message
    3aychoucha, sur quelle plateforme developpes-tu ?
    Si c'est sous windows, il me semble que tous les types de base sont de même taille sauf size_t, et les pointeurs bien sûr (avec les assimilables comme intptr_t par exemple).
    Je travaille avec visual studio 2012 sur windows 7 64 bits

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