web-dev-qa-db-fra.com

Le moyen le plus rapide de calculer la différence entre deux nombres?

Je suis sur le point de le faire en C++, mais je dois le faire dans plusieurs langues. C'est un problème assez commun et simple, et c'est la dernière fois. J'en ai assez de le coder comme je le fais, je suis sûr qu'il doit y avoir une meilleure méthode, alors je poste ici avant d'écrire la même méthode longue dans une autre langue;

Prendre en compte (fleurs de lys!) code suivant;

// I want the difference between these two values as a positive integer
int x = 7
int y = 3
int diff;
// This means you have to find the largest number first 
// before making the subtract, to keep the answer positive
if (x>y) { 
     diff = (x-y);
} else if (y>x) {
     diff = (y-x);
} else if (x==y) {
    diff = 0;
}

Cela peut sembler mesquin, mais cela me semble beaucoup, juste pour faire la différence entre deux chiffres. Est-ce vraiment une façon tout à fait raisonnable de faire les choses et je suis inutilement pédant, ou est-ce que mon sens spidey fourmille de bonnes raisons?

16
jwbensley

Obtenez juste la valeur absolue de la différence:

#include <cstdlib>
int diff = std::abs(x-y);
41
juanchopanza

L'utilisation de la fonction std::abs() est un moyen clair de le faire, comme d'autres l'ont suggéré.

Mais peut-être êtes-vous intéressé par l'écriture succincte de cette fonction sans appel de bibliothèque.

Dans ce cas

diff = x > y ? x - y : y - x;

est un moyen court.

Dans vos commentaires, vous avez suggéré que la vitesse vous intéresse. Dans ce cas, vous pouvez être intéressé par des façons d'effectuer cette opération ne nécessitant pas de branching . Ce lien en décrit quelques-uns.

23
ShinTakezou
#include <cstdlib>

int main()
{
    int x = 7;
    int y = 3;
    int diff = std::abs(x-y);
}
13
user529758

Cela dépend de ce que vous entendez par plus court. Le temps d'exécution rapide, la compilation la plus rapide, le moins de lignes, le moins de mémoire. Je suppose que vous voulez dire runtime.

#include <algorithm>    // std::max/min   
int diff = std::max(x,y)-std::min(x,y);

Cela fait deux comparaisons et une opération (celle-ci est inévitable mais pourrait être optimisée par certaines opérations au niveau des bits avec des cas spécifiques, le compilateur pourrait toutefois le faire pour vous). De plus, si le compilateur est suffisamment intelligent, il ne peut effectuer qu'une seule comparaison et enregistrer le résultat pour l'autre comparaison. Par exemple, si X> Y, vous savez dès la première comparaison que Y <X, mais je ne sais pas si les compilateurs en tireront parti.

2
Rapnar