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 éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    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 éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    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 éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    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.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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 éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    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 éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    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
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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 émérite
    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
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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 éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    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 éprouvé
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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 éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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.

  19. #19
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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 éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    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