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

Visual C++ Discussion :

evc4:division des doubles


Sujet :

Visual C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 29
    Points
    29
    Par défaut evc4:division des doubles
    un petit problème pour les calculs des doubles.
    j'utilise evc4, voici mon code:
    double lat1=45.8541;
    double lat2=45.854;
    double deltaLat=lat1-lat2; //cette ligne donne bien 0.0001
    deltaLat=deltaLat/2; //et là 5.00000000016
    vous savez qu'est-ce qu'il s'est passé ??

  2. #2
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Je ne voit pas de pb chez moi...

    j'obtiens 5.0000000001659828e-005

    Tu n'aurrais pas oublié de regarder le e-005 ?
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    oui, effectivement
    mais problème n'est pas résolu, en fait, j'ai fait une fonction qui calcul la distance entre 2 points latitude/longitude, mais le résultat est totalement faux.

    #include <math.h>
    double Distance(double Lat1,double Lng1,double Lat2,double Lng2)
    {
    double rayonTerre=6371;
    double deltaLat=Lat1-Lat2;
    double deltaLng=Lng1-Lng2; //jusqu'à ici c'est juste

    double a=sin(deltaLat/2)*sin(deltaLat/2)+
    cos(Lat1)*cos(Lat2)*sin(deltaLng/2)*sin(deltaLng/2);
    double c=2*atan2(sqrt(a),sqrt(1-a));
    double distance=rayonTerre*c;
    return distance; //le résultat est complètement faux, du gerne 0.7 au lieu de 0.02
    }

  4. #4
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Quelles sont tes données d'entrées ?
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Les données entrées:
    Lat1=45.854 Lng1=4.7319
    Lat2=45.8541 Lng2=4.7321

    J'attend comme résultat 0.01907 (en théorie) mais j'ai 0.740652288866354

    L'incertitude (740 mètres par rapport à 20 mètres) est quand même inacceptable...

  6. #6
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Je pense que tu devrais convertir tes angles en radians...

    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Je ne prendrai pas la peine de lire ton code.

    Une telle erreur vient forcément de l'algorithme, car si c'était le compilateur ou/et le processeur, ça se saurait depuis longtemps, n'est-ce pas ?

    Donc revois ton calcul, en faisant quand même attention aux approximations inévitables quand on calcule avec des réels (par exemple, faire la différence entre deux valeurs très proches peut donner un résultat loin de la valeur attendue, idem diviser par une valeur très faible...).
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  8. #8
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Je suis d'accord avec thewho

    2 choses me choquent dans ton algorithme :

    - Tu utilises apparemment des degrés plutôt que des radians
    - Tu renvois des km plutôt que des m

    Place toi toujours dans un système universel
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    j'utilise le formulaire d'Haversine, les lat/lng sont sous forme de degré décimale.
    R = earth’s radius (6371km)
    Δlat = lat2− lat1
    Δlong = long2− long1
    a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
    c = 2.atan2(√a, √(1−a))
    d = R.c

    donc l'algorithme n'a aucun erreur.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    sauf que les fonction sin, atan2, ... prennent des radians et non des degrés comme la formule le laisse à penser. Fais le test au lieu de dire que ce n'est pas ça.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Ouiiiiii, c'est bien ça le problème
    j'ai converti les degrés en radians, et ça donne des bonnes résultats.
    Merci beaucoup les gars !!

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

Discussions similaires

  1. Division des valeurs doubles
    Par loudji dans le forum Débuter avec Java
    Réponses: 14
    Dernier message: 16/02/2013, 04h27
  2. IBExpert : troncature des double precision ?
    Par Magnus dans le forum Outils
    Réponses: 1
    Dernier message: 25/08/2005, 15h07
  3. [TList]: trier des doubles
    Par PpPool dans le forum Langage
    Réponses: 6
    Dernier message: 11/08/2005, 11h34
  4. [C/C++] afficher des doubles dans une message box
    Par lalaurie40 dans le forum MFC
    Réponses: 1
    Dernier message: 24/05/2005, 14h55
  5. division de "double" par "0"
    Par ickis dans le forum C
    Réponses: 14
    Dernier message: 31/08/2003, 19h09

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