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 :

comparaison de doubles, valeur absolue et perf


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Par défaut comparaison de doubles, valeur absolue et perf
    Bonjour,

    Je cherche à coder une fonction qui qui prend en parametre deux doubles et renvoie true si la distance entre ces deux doubles est plus petite qu'une valeur determinée à l'avance.(settée via un #define seuil par ex)

    Ma contrainte est que cette fonction soit la plus performante possible( pour du calcul numérique, cette opération sera effectuée plusieurs milliards de fois)...

    J'allais partir sur une implementation classique en utilisant std::abs ou fabs pour mesurer la distance entre mes deux nombres, puis faire une comparaison avec le seuil, mais je me demandais s'il n'y avait pas des astuces pour faire plus rapide ? (du style équivalent des bitwise operations qu'on peut faire sur des types entiers ?)

    Si qqu'un à un lien ou un article à conseiller là dessus, ou des astuces je suis preneur

    merci!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Je ne sais pas si ça va te faire gagner du temps mais une macro du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define SEUIL 1e-10
    #define COMPARE(a,b) ((fabs((a)-(b)) < SEUIL) ? true : false)
    et de l'utiliser ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool test=COMPARE(a,b);
    je n'ai pas testé si tu allais gagner du temps...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Par défaut
    Je vais tester ça.
    Merci

  4. #4
    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 : 50
    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
    Par défaut
    Cette macro ne fait rien d'autre que la comparaison que tu as dit vouloir éviter... Et en plus, c'est une macro

    De plus, a<b retourne un booleen. Je ne vois donc pas le besoin de faire (a<b ? true : false) là où (a<b) est équivalent. Ou alors, autant faire ((a<b?true : false) ? true : false)

    Honnêtement, sur ce genre de choses, je ne crois pas qu'il y ait plus rapide que le fabs. Mais je crois surtout qu'il est assez improbable que le temps passé à cette opération ait un impact significatif sur le temps global de calcul.
    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.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Je rejoint pleinement l'avis de JolyLoic (une fois n'est pas coutume )

    Selon moi, bien plus que d'essayer de gagner une ou deux fréquence d'horloge avec un sucre syntaxique quelconque, tu devrais déjà essayer d'améliorer ton algorithme pour, quitte à y passer un tout petit peu de temps, te permettre d'éviter toutes les itérations inutiles...

    Ainsi, s'il t'es possible de créer un algorithme basé - par exemple - sur la dichotomie, tu pourrait en arriver à ne faire le test qu'à peine plus de 32 fois...(s'il s'agit de rechercher une valeur parmis 4 milliards de valeurs possibles)

    Pour rappel, la principale condition pour pouvoir utiliser la dichotomie est le fait que les valeurs soient triées...

    Les deux "structures" les plus aptes à la permettre étant l'arbre binaire (idéal s'il est complet) et le tableau (éventuellement le std::vector) car ce dernier autorise un accès aléatoire aux données

    Sinon, il est fort vraisemblable que les milliards de fois où ce test sera effectués viennent de plusieurs boucles imbriquées.

    Encore une fois, si tu arrive à supprimer toutes les itérations, en fonction de la boucle dans laquelle tu te trouves, pour les valeurs dont tu sais "pertinemment" qu'elle donneront un résultat donné (soit vrai, soit faux), tu en arrivera à gagner énormément de temps d'exécution, et ce... malgré le fait que tu ajoute sans doute un test.

    La raison est simple, pour arriver à un milliard d'exécutions, on peut envisager entre autre un algorithme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pour i= 0 à 1000
        pour j = 0 à 1000
            pour k = 0 à 1000
                if( fabs(a<b)
                    faire quelque chose
            fin pour
        fin pour
    fin pour
    Si tu ajoutes un test proche de
    (simple exemple) dans la boucle "pour i" et décidant d'entrer dans la boucle "pour j", tu réduira déjà de moitié les tests effectués
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    De plus fabs est une fonction intrinsic... donc est traduite directement en assembleur....

    Au pire si tu as besoin de le faire absoluement (profiling avant), tu veux juste tester l'exposant du double (dont la representation est: S * 1.F x 2^E)... donc... (1 bit de signe, 11 bits d'exposant, et 52 bits de mantisse)
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define  SEUIL        0x0030000000000000
    #define  EXP_MASK  0x7FF0000000000000
    inline boolean _fast_double_test(const double& d)
    {
         return ((*((const int64*)&d)) & EXP_MASK) < SEUIL;
    }
    Mais encore une fois, je ne suis même pas sur que ca te permette de grapiller quelques ns... Le &EXP_MASK revenant grosso merdo au fabs ....

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

Discussions similaires

  1. Comparaison en valeur absolue
    Par ngouagme dans le forum VHDL
    Réponses: 0
    Dernier message: 02/05/2009, 14h43
  2. comparaison de 4 valeurs
    Par defconfem dans le forum C
    Réponses: 10
    Dernier message: 15/02/2006, 22h01
  3. [C#][operateur/function] valeur absolue
    Par Vessaz dans le forum C#
    Réponses: 2
    Dernier message: 12/12/2005, 16h21
  4. Réponses: 4
    Dernier message: 28/10/2005, 16h30
  5. [FLASH MX] Valeur absolue
    Par Toutouffe dans le forum Flash
    Réponses: 2
    Dernier message: 24/01/2005, 00h35

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