Esiste una funzione di segno standard (signum, sgn) in C / C ++?
Sì, a seconda della definizione.
C99 e successive ha la signbit()
macro in<math.h>
int signbit
(reale x
);
La signbit
macro restituisce un valore diverso da zero se e solo se il segno del valore dell'argomento è negativo. C11 §7.12.3.6
Eppure OP vuole qualcosa di leggermente diverso.
Voglio una funzione che ritorni -1 per i numeri negativi e +1 per i numeri positivi. ... una funzione che lavora sui galleggianti.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Più profondo:
Il post non è specifico nei seguenti casi: x = 0.0, -0.0, +NaN, -NaN
.
Un classico signum()
ritorna +1
su x>0
, -1
su x<0
e0
avantix==0
.
Molte risposte lo hanno già trattato, ma non si rivolgono x = -0.0, +NaN, -NaN
. Molti sono orientati a un punto di vista intero che di solito manca di Not-a-Numbers ( NaN ) e -0.0 .
Le risposte tipiche funzionano come signnum_typical()
On -0.0, +NaN, -NaN
, ritornano 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;
}
Invece, propongo questa funzionalità: On -0.0, +NaN, -NaN
, ritorna -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;
}