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 :

un peu de Math


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 116
    Points : 40
    Points
    40
    Par défaut un peu de Math
    Bonjour,
    je voudrais connaitre la distance entre deux points dont je connais la longitude et la latitude.
    J'ai trouvé cette formule :

    AB = acos(sin(LatRadA)*sin(LatRadB) + cos(LatRadA)*cos(LatRadB)*cos(LongRadB-LongRadA));

    Les valeurs de la longitude et de latitude doivent à par rament etre converti en radian.

    Malheureusement quand je programme ça sos visual C++, je n'arrive pas à obtenir la bonne distance.

    Est ce que qqun à une suggestion?

    Merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    ou est defini le rayon terrestre ..?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    double post ... raté !

    Pour ma part, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double calcdist( double LT1, double LG1, double LT2, double LG2 )  // en metres
    {
        double D = rayonterre(LT1) * acos((cos(D2R*LT1) * cos(D2R*LT2) * cos(D2R*(LG2-LG1))) + (sin(D2R*LT1) * sin(D2R*LT2)));
        return D;
    }
    D2R est un zolie macro pour convertir les deg en rad
    rayonterre est un fonction qui renvoie le rayon terrestre (lié à la latitude):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Rayon terrestre
    #define Rmax    6378140 // a l'equateur
    #define Rmin    6356755 // au pole
     
    double rayonterre( double LT ) {
        double R = ( Rmax + Rmin ) / 2.;            // rayon moyen
        R += ( ( Rmax - Rmin ) / 2. ) * cos( 2 * LT * D2R );    // variation du rayon
        return R;
    }
    Tu veux aussi le cap ..?

  4. #4
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par Dje14
    ou est defini le rayon terrestre ..?
    Bien d'accord ! sinon je pense que ce sujet serait plus approprié sur le forum Algorithmes...

    A+
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 116
    Points : 40
    Points
    40
    Par défaut
    pour le rayon terrestre j'ai oublier de le mettre, mais il suffit de multiplier le formule par le rayon de la terre

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 116
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Dje14
    double post ... raté !

    Pour ma part, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double calcdist( double LT1, double LG1, double LT2, double LG2 )  // en metres
    {
        double D = rayonterre(LT1) * acos((cos(D2R*LT1) * cos(D2R*LT2) * cos(D2R*(LG2-LG1))) + (sin(D2R*LT1) * sin(D2R*LT2)));
        return D;
    }
    D2R est un zolie macro pour convertir les deg en rad
    rayonterre est un fonction qui renvoie le rayon terrestre (lié à la latitude):
    A quoi ressemble ta macro D2R stp?

    merci

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    bein ...
    #define D2R 0.0174532925199433
    c'est 180./Pi pour éviter de rajouter des calculs dans le code
    Tu sais faire une regle de 3 quand même ..?

    Mais si tu ne copies pas betement mon code, tu n'en a pas besoin vu que tes coordonnees sont deja en radians

  8. #8
    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
    Citation Envoyé par Dje14
    #define D2R 0.0174532925199433
    c'est 180./Pi pour éviter de rajouter des calculs dans le code
    Beark !

    Si tu veux une constante égale à 180/Pi, pourquoi ne pas écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double const D2R = 180/Pi;
    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.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    Parce que vu que c'est une partie critique en perf de mon prog, j'ai préféré limiter les calcules (cible : ARM sans fpu) 4 / en moins c'est bien !

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Juste pour la curiosité mais le compilateur remplace betement? Il ne fait pas le calcul une seule fois?

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Parce que vu que c'est une partie critique en perf de mon prog, j'ai préféré limiter les calcules (cible : ARM sans fpu) 4 / en moins c'est bien !
    Juste pour la curiosité mais le compilateur remplace betement? Il ne fait pas le calcul une seule fois?
    Justement, l'intêret de remplacer une macro par une variable constante est de faire le calcul une et une seule fois.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    Je crois que le compilateur remplace l'appel de la macro par le code de la macro a la premiere passe. (Ce qui peut d'ailleurs poser des problèmes au debugguage)

  13. #13
    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
    As tu fait les mesures de perf ?
    En utilisant une constante calculable à la compilation, qu'est-ce qui pourrait être une baisse de perf par rapport à l'utilisation d'un macro ?
    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.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    J'ai dans l'idée qu'il est plus rapide de faire a = 123.456 que b = 123456./1000.
    Maintenant, c'est plus un choix d'implémentation qu'une modification pour rendre le prog plus rapide.

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Dje14
    J'ai dans l'idée qu'il est plus rapide de faire a = 123.456 que b = 123456./1000.
    Maintenant, c'est plus un choix d'implémentation qu'une modification pour rendre le prog plus rapide.
    Oui mais ce calcul est effectué une seule fois au lancement du programme... Alors est-ce bien important ? D'autant plus que n'importe quel bon compilo inscrira certainement directement le résultat dans le code généré.

  16. #16
    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
    Citation Envoyé par Dje14
    J'ai dans l'idée qu'il est plus rapide de faire a = 123.456 que b = 123456./1000.
    J'ai dans l'idée que tu te trompes. Par exemple, avec VC++ (mais je suis prêt à mettre ma main à couper que c'est pareil avec n'importe quel compilateur), et en mode non optimisé, le programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
    	int a = 420/10;
    	int a1 = 42;
    	double b = 420./10.;
    	double b1 = 42.;
    	return a/b;
    }
    Génère le code assembleur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	int a = 420/10;
    0041134E  mov         dword ptr [a],2Ah 
    	int a1 = 42;
    00411355  mov         dword ptr [a1],2Ah 
    	double b = 420./10.;
    0041135C  fld         qword ptr [__real@4045000000000000 (415750h)] 
    00411362  fstp        qword ptr [b] 
    	double b1 = 42.;
    00411365  fld         qword ptr [__real@4045000000000000 (415750h)] 
    0041136B  fstp        qword ptr [b1] 
    	return a/b;
    0041136E  fild        dword ptr [a] 
    00411371  fdiv        qword ptr [b] 
    00411374  call        @ILT+185(__ftol2_sse) (4110BEh)
    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.

  17. #17
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    je confirme : les compilateurs remplacent les expressions utilisant des constantes par la valeur correspondante
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    Ah !!
    Bein merci pour l'info !

Discussions similaires

  1. Un peu de maths
    Par KamaShin dans le forum Physique
    Réponses: 3
    Dernier message: 30/06/2009, 01h23
  2. un peu de math
    Par craryb dans le forum C++
    Réponses: 4
    Dernier message: 24/08/2007, 13h38
  3. un peu de math..
    Par philippe123 dans le forum Langage
    Réponses: 8
    Dernier message: 09/12/2006, 16h19
  4. Un peu de maths
    Par ®om dans le forum Mathématiques
    Réponses: 1
    Dernier message: 25/11/2006, 17h36

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