Existe-t-il une fonction standard de signe (signum, sgn) en C/C++ ?
Oui, selon la définition.
Le C99 et les versions ultérieures ont le signbit()
macro dans <math.h>
int signbit
(réel-flottant x
) ;
Le site signbit
renvoie une valeur non nulle si et seulement si le signe de la valeur de son argument est négatif. C11 §7.12.3.6
Pourtant, OP veut quelque chose d'un peu différent.
Je veux une fonction qui renvoie -1 pour les nombres négatifs et +1 pour les nombres positifs. ... une fonction fonctionnant sur les flottants.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Plus profond :
La question du PO n'est pas spécifique dans les cas suivants : x = 0.0, -0.0, +NaN, -NaN
.
Un classique signum()
renvoie à +1
sur x>0
, -1
sur x<0
y 0
sur x==0
.
De nombreuses réponses ont déjà couvert ce point, mais n'abordent pas les questions suivantes x = -0.0, +NaN, -NaN
. Beaucoup d'entre elles sont conçues pour un point de vue entier qui ne tient pas compte des chiffres non significatifs ( NaN ) et -0.0 .
Les réponses typiques fonctionnent comme suit signnum_typical()
Sur -0.0, +NaN, -NaN
ils reviennent 0.0, 0.0, 0.0
.
int signnum_typical(double x) {
if (x > 0.0) return 1;
if (x < 0.0) return -1;
return 0;
}
Au lieu de cela, je propose cette fonctionnalité : Sur -0.0, +NaN, -NaN
il renvoie -0.0, +NaN, -NaN
.
double signnum_c(double x) {
if (x > 0.0) return 1.0;
if (x < 0.0) return -1.0;
return x;
}
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 ?
0 votes
@ysth : C'est vrai pour les flottants mais pas pour les ints, donc je suppose que la question est : est-ce que le questionneur est intéressé par les flottants ou les ints ?
9 votes
@ysth @Craig McQueen, faux pour les flottants aussi, non ? sgn(x)'s définition dit de retourner 0 si
x==0
. Selon IEEE 754 le zéro négatif et le zéro positif doivent être comparés comme égaux.0 votes
@RJFalconer : Je ne comprends pas votre commentaire. Que dites-vous qui est faux ?
9 votes
@ysth "cela dépend du zéro positif ou du zéro négatif". En fait, ce n'est pas le cas.
0 votes
@RJFalconer Le
sgn()
de votre commentaire est une vision raisonnable de la façon de gérer les zéros. OP ne spécifie qu'indirectement le signe du zéro avec un lien. Une autre vision raisonnable du "signe" est de retourner 1,-1 sur +zéro,-zéro. Parfois, le signe de zéro fait la différence . Cela dépend des besoins de l'utilisateur. Voir aussi NaN est un considération selon les indications de l'OPfloat
.6 votes
Je commente tardivement, mais concernant les zéros signés, une autre option raisonnable est que sgn(x) renvoie x, lorsque x est zéro. En d'autres termes, vous obtenez 0, mais c'est un zéro signé avec le même signe que l'entrée. @RJFalconer Dans les cas relativement peu nombreux où les zéros signés importent, vous obtenez une réponse sensée, et dans les autres cas, cela ne fait aucune différence.
1 votes
Quel résultat doit être renvoyé pour une valeur NaN ?
0 votes
C ou C++ - choisissez-en un, pas les deux. Ce sont des langages différents.
0 votes
C99, C++ : cplusplus.com/reference/cmath/signbit