Die Frage ist alt, aber es gibt jetzt diese Art der gewünschten Funktion. Ich habe einen Wrapper mit not, left shift und dec hinzugefügt.
Sie können eine Wrapper-Funktion verwenden, die auf Vorzeichen aus C99 um genau das gewünschte Verhalten zu erreichen (siehe Code weiter unten).
Gibt zurück, ob das Vorzeichen von x negativ ist.
Dies kann auch auf Unendlichkeiten, NaNs und Nullen angewandt werden (wenn die Null vorzeichenlos ist, wird sie als positiv betrachtet).
#include <math.h>
int signValue(float a) {
return ((!signbit(a)) << 1) - 1;
}
NB: Ich verwende den Operanden not ("!"), weil der Rückgabewert von signbit nicht 1 sein soll (auch wenn die Beispiele vermuten lassen, dass es immer so ist), sondern wahr für eine negative Zahl:
Rückgabewert
Ein Wert ungleich Null (wahr), wenn das Vorzeichen von x negativ ist; andernfalls Null (falsch).
Dann multipliziere ich mit zwei mit Linksverschiebung (" << 1"), was uns 2 für eine positive Zahl und 0 für eine negative Zahl ergibt, und schließlich dekrementiere ich um 1, um 1 und -1 für positive bzw. negative Zahlen zu erhalten, wie von OP gewünscht.
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