Existe-t-il une fonction de signe standard (signum, sgn) en C / C ++?
Oui, selon la définition.
C99 et versions ultérieures ont la signbit()
macro dans<math.h>
int signbit
(flottant réel x
);
La signbit
macro renvoie une valeur non nulle si et seulement si le signe de sa valeur d'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 travaillant sur les flotteurs.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Plus profond:
Le poste n'est pas spécifique dans les cas suivants: x = 0.0, -0.0, +NaN, -NaN
.
Un classique des signum()
retours +1
sur x>0
, -1
sur x<0
et 0
sur x==0
.
De nombreuses réponses ont déjà couvert ce point, mais n'en traitent pas x = -0.0, +NaN, -NaN
. Beaucoup sont adaptés à un point de vue entier qui manque généralement de Not-a-Numbers ( NaN ) et -0.0 .
Les réponses typiques fonctionnent comme signnum_typical()
On -0.0, +NaN, -NaN
, elles 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é: Oui -0.0, +NaN, -NaN
, elle revient -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;
}