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 :

Cast ou précision des float différents sous linux et windows ??!


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut Cast ou précision des float différents sous linux et windows ??!
    J'ai un petit problème après une compilation d'un prog écrit sous linux que je voulais test sous windows.

    Voilà le même code me donne pas le même résultat selon l'O.S
    Sous linux je compile dans le terminal avec gcc, via code:: sous windows, les options de compil sont les mêmes, le fichier .C est le même.

    Voici la partie de code qui foire :
    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
     
    int zoomPixbuf (void **adressePixbuf,float zoomValeur)
    {
      float width;
     
      GdkPixbuf *pixbuf;
     
      pixbuf = (GdkPixbuf *)((gpointer)*adressePixbuf);
     
       width = gdk_pixbuf_get_width(pixbuf)*zoomValeur;
     
     
        printf("%f\n",width);
        printf("%f\n",gdk_pixbuf_get_width(pixbuf)*zoomValeur);
        printf("%f\n",(float)(gdk_pixbuf_get_width(pixbuf)*zoomValeur));
     
    .....
     
    }
    float zoomValeur = 100.0/gdk_pixbuf_get_width(pixbuf);
    int gdk_pixbuf_get_width(pixbuf) = 66;

    Sous linux :
    100.000000
    100.000000
    100.000000

    Sous Windows (Vista) :
    100.000000
    99.999999
    99.999999

    Du coup, quand je casterais en int sous windows les deux dernières versions, je me retrouve avec 99 et pas 100 comme valeur !

    Pouvez vous éclairer ma lanterne SVP

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Points : 380
    Points
    380
    Par défaut
    Déjà en ce qui concerne le cast en int, c'est normal, en effet, caster un float/double en int revient à tronquer le nombre et ne garder que la partie entière, pas d'arrondie...
    Pour le nombre c'est vraiment bizarre, je sais que la précision d'un float laisse à désirer et donc que tout les réels ne peuvent pas être représenté, mais là il s'agit de la même variable semble-t-il... À moins que ce ne soit pas la même ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par PsychoH13
    Déjà en ce qui concerne le cast en int, c'est normal, en effet, caster un float/double en int revient à tronquer le nombre et ne garder que la partie entière, pas d'arrondie...?
    +1 pas de problème pour le cast de int, ça c'est ce qui découle au final du problème (je récupre 99 au lieu de 100), mon souci c'est plutôt le cast en float d'avant qui se fait mal ...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    je crains que ce soit la meme chose.... la précision d'un flot est de 1.e-7 (en relatif) et tu atteinds cette précision...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par reptils
    je crains que ce soit la meme chose.... la précision d'un flot est de 1.e-7 (en relatif) et tu atteinds cette précision...
    Mais pourquoi cette différence entre les deux 0.S ? un float en c sous windows ou linux ça reste un float non ?

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Trois sources possibles de difference:
    - la norme autorise a faire certains calculs avec une precision plus elevee. Des compilateurs differents peuvent faire des choix differents (en particulier sous Linux utiliser des long double de 80 bits)
    - gcc pour x86 ne respecte pas la norme et fait d'autres calculs avec une precision plus elevee qu'autorisee
    - des optimisations differentes peuvent introduire des petites differences aussi en restant dans le cadre de la norme.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    Testé avec gcc de mingw32 (3.4.2 je crois)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int main()
    {
       float a,b;
     
       a=100.;
       b=99.999999;
     
       if(a==b)
          printf("idem!\n");
     
       return 0;
    }
    Le monsieur me dit "idem!".
    Bon le temps que je reboot ma machine sous ubuntu je te dis si j'ai la meme chose

    EDIT (depuis ubuntu ): j'ai la meme chose sous linux

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    de toutes façons on a déjà répété moultes fois que faire a==b avec des flotas ou des doubles n'est pas correct....


    • Il faut tenir compte du FLT_EPSILON ou DBL_EPSILON...

    • D'autre part, pour avoir l valeur entière la plus proche d'un réel, c'est int(a+0.5)

    • Et enfin cf remarques de Jean-Marc.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    C'est clair sans l'être vraiment, c'est torturé ces cast de float. Je retiens la solution de souviron qui me permet d'avoir le même résultat sur les deux O.S, sans passer par moult cast et créations de variables temporaires.

    Merci à tous en tt cas !

    P.S : gcc pour x86 de toute j'utilise le même processeur sous linux et windows et j'ai pas de PowerPC sous la main pour tester lol ??! qu'est ce que tu appelles gcc x86 ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    Citation Envoyé par souviron34
    de toutes façons on a déjà répété moultes fois que faire a==b avec des flotas ou des doubles n'est pas correct....


    • Il faut tenir compte du FLT_EPSILON ou DBL_EPSILON...

    • D'autre part, pour avoir l valeur entière la plus proche d'un réel, c'est int(a+0.5)

    • Et enfin cf remarques de Jean-Marc.
    oui je suis d'accord mais ça montre que le systeme ne fait pas la difference entre ces deux float car vu de la meme façon!
    de plus FLT_EPSILON=1e-5 donc avec les arrondis c'est identique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rendu PHP différent sous Linux et Windows
    Par AnatomicJC dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 25/06/2009, 15h29
  2. Ecrire dans des partitions NTFS sous linux
    Par PhiberOptik dans le forum Administration système
    Réponses: 9
    Dernier message: 28/11/2006, 15h09
  3. Créer et utiliser des fichiers excel sous linux
    Par cronos6 dans le forum Zope
    Réponses: 2
    Dernier message: 02/06/2006, 09h14
  4. [Javascript] Précision des float
    Par NicoNours dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/03/2006, 09h12
  5. Lire des fichiers iso sous linux
    Par wodel dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 28/11/2005, 10h17

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