Gibt es eine Standardzeichenfunktion (signum, sgn) in C / C ++?
Ja, je nach Definition.
C99 und höher hat das signbit()
Makro in<math.h>
int signbit
(Real-Floating x
);
Das signbit
Makro gibt genau dann einen Wert ungleich Null zurück, wenn das Vorzeichen seines Argumentwerts negativ ist. C11 §7.12.3.6
Dennoch möchte OP etwas anderes.
Ich möchte eine Funktion, die -1 für negative Zahlen und +1 für positive Zahlen zurückgibt. ... eine Funktion, die an Schwimmern arbeitet.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Tiefer:
Die Stelle ist in folgenden Fällen nicht spezifisch : x = 0.0, -0.0, +NaN, -NaN
.
Ein Klassiker signum()
kehrt +1
auf x>0
, -1
an x<0
und 0
auf x==0
.
Viele Antworten haben dies bereits behandelt, aber nicht angesprochen x = -0.0, +NaN, -NaN
. Viele sind auf eine ganzzahlige Sichtweise ausgerichtet, der normalerweise Not-a-Numbers ( NaN ) und -0,0 fehlen .
Typische Antworten funktionieren wie signnum_typical()
Ein -0.0, +NaN, -NaN
, sie kehren zurück 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;
}
Stattdessen schlage ich diese Funktionalität vor: Ein -0.0, +NaN, -NaN
, es kehrt zurück -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;
}