Gibt es eine Standard-Vorzeichenfunktion (signum, sgn) in C/C++?
Ja, je nach Definition.
C99 und später hat die signbit()
Makro in <math.h>
int signbit
(real-floating x
);
Die signbit
gibt nur dann einen Wert ungleich Null zurück, wenn das Vorzeichen des Argumentwerts negativ ist. C11 §7.12.3.6
Doch OP will etwas ganz anderes.
Ich möchte eine Funktion, die -1 für negative Zahlen und +1 für positive Zahlen zurückgibt. ... eine Funktion, die mit Gleitkommazahlen arbeitet.
#define signbit_p1_or_n1(x) ((signbit(x) ? -1 : 1)
Tiefer:
Die Frage des Auftraggebers ist in den folgenden Fällen nicht spezifisch: x = 0.0, -0.0, +NaN, -NaN
.
Ein Klassiker signum()
gibt zurück. +1
auf x>0
, -1
auf x<0
y 0
auf x==0
.
Viele Antworten haben dies bereits abgedeckt, gehen aber nicht darauf ein x = -0.0, +NaN, -NaN
. Viele sind auf eine ganzzahlige Sichtweise ausgerichtet, die in der Regel keine Not-a-Numbers ( NaN ) und -0.0 .
Typische Antworten funktionieren wie signnum_typical()
Auf -0.0, +NaN, -NaN
kehren sie 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 Funktion vor: Auf -0.0, +NaN, -NaN
gibt er 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;
}
28 Stimmen
Was sollte er für 0 zurückgeben?
91 Stimmen
@Craig McQueen; das hängt davon ab, ob es sich um eine positive Null oder eine negative Null handelt.
1 Stimmen
Mir ist aufgefallen, dass Sie den Rückgabewert als Ganzzahl angegeben haben. Suchen Sie nach einer Lösung, die Ganzzahlen oder Fließkommazahlen verarbeitet?
0 Stimmen
@ysth: Richtig für Floats, aber nicht für Ints. Die Frage ist also: Ist der Fragesteller an Floats oder Ints interessiert?
11 Stimmen
@ysth @Craig McQueen, false auch für Floats, oder? sgn(x)'s Definition besagt, dass 0 zurückgegeben werden soll, wenn
x==0
. Nach IEEE 754 sollten negative Nullen und positive Nullen als gleichwertig betrachtet werden.0 Stimmen
@RJFalconer: Ich verstehe Ihren Kommentar nicht. Was sagen Sie, ist falsch?
9 Stimmen
@ysth "es hängt von der positiven Null oder der negativen Null ab". In der Tat, das ist nicht der Fall.
0 Stimmen
@RJFalconer Die
sgn()
Ihrer Kommentar ist eine vernünftige Vorstellung davon, wie Nullen zu behandeln sind. OP hat das Vorzeichen der Null nur indirekt mit einem Link angegeben. Eine andere vernünftige Sichtweise auf das "Vorzeichen" ist die Rückgabe von 1,-1 bei +Null, -Null. Manchmal ist das Vorzeichen von Null macht einen Unterschied . Das hängt von den Bedürfnissen des Benutzers ab. Auch NaN ist eine Berücksichtigung wie von OP angegebenfloat
.8 Stimmen
Zu spät kommentiert, aber in Bezug auf vorzeichenbehaftete Nullen ist eine weitere vernünftige Option, dass sgn(x) x zurückgibt, wenn x Null ist. Mit anderen Worten, man bekommt 0 heraus, aber es ist eine vorzeichenbehaftete Null mit dem gleichen Vorzeichen wie die Eingabe. @RJFalconer In den relativ wenigen Fällen, in denen vorzeichenbehaftete Nullen eine Rolle spielen, erhält man eine vernünftige Antwort, und in den anderen Fällen macht es keinen Unterschied.
1 Stimmen
Welches Ergebnis sollte für einen NaN-Wert zurückgegeben werden?
0 Stimmen
C oder C++ - wählen Sie eines, nicht beide. Es sind unterschiedliche Sprachen.
0 Stimmen
C99, C++ : cplusplus.com/referenz/cmath/signbit