Ein bisschen off-topic, aber ich benutze das:
template<typename T>
constexpr int sgn(const T &a, const T &b) noexcept{
return (a > b) - (a < b);
}
template<typename T>
constexpr int sgn(const T &a) noexcept{
return sgn(a, T(0));
}
und ich fand die erste Funktion - die mit zwei Argumenten - sehr viel nützlicher als die "Standard"-Funktion sgn(), weil sie am häufigsten in Code wie diesem verwendet wird:
int comp(unsigned a, unsigned b){
return sgn( int(a) - int(b) );
}
vs.
int comp(unsigned a, unsigned b){
return sgn(a, b);
}
gibt es keinen Cast für vorzeichenlose Typen und kein zusätzliches Minus.
In der Tat habe ich dieses Stück Code mit sgn()
template <class T>
int comp(const T &a, const T &b){
log__("all");
if (a < b)
return -1;
if (a > b)
return +1;
return 0;
}
inline int comp(int const a, int const b){
log__("int");
return a - b;
}
inline int comp(long int const a, long int const b){
log__("long");
return sgn(a, b);
}
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