468 votes

Existe-t-il une fonction standard de signe (signum, sgn) en C/C++ ?

Je veux une fonction qui renvoie -1 pour les nombres négatifs et +1 pour les nombres positifs. http://en.wikipedia.org/wiki/Sign_function Il est assez facile d'écrire mon propre code, mais il semble que ce soit quelque chose qui devrait se trouver quelque part dans une bibliothèque standard.

Edit : Plus précisément, je cherchais une fonction fonctionnant sur les flottants.

21 votes

Que doit-il retourner pour 0 ?

78 votes

@Craig McQueen ; cela dépend si c'est un zéro positif ou un zéro négatif.

1 votes

J'ai remarqué que vous avez spécifié la valeur de retour comme un nombre entier. Cherchez-vous une solution qui prend des entiers ou des nombres à virgule flottante ?

-2voto

Rasoul Points 650

J'utilise la fonction suivante pour déterminer le signe d'un float o double variable :

template <typename T>
int
sign(T val)
{
    if( val <= -std::numeric_limits<T>::epsilon() ) return(-1);
    if( val >= std::numeric_limits<T>::epsilon() ) return(1);
    return(0);
}

-3voto

DarthNoodles Points 283

J'ai tendance à utiliser les éléments suivants :

signval = i/abs(i) ;

Cela donne +/- 1 bien que ce ne soit probablement pas très rapide.

-3voto

cyberion Points 9
double signof(double a) { return (a == 0) ? 0 : (a<0 ? -1 : 1); }

-3voto

hoford Points 7

J'avais besoin de résoudre ce problème. Voici ce que j'ai trouvé.

int sign(int v){
   return  ((v >> 31) | -(-v >> 31));
}

-3voto

Bla Points 1

L'expression suivante renvoie le signe de x (1 si x > 0 positif, -1 si x < 0 négatif, ou 0 si x est égal à 0) :

x != 0 ? abs(x) / x : 0;

Vous pouvez également utiliser la méthode System::Math::Sign.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X