Kann überprüft werden, ob a float
eine positive Null (0,0) oder eine negative Null (-0,0) ist?
Ich habe das float
in ein konvertiert String
und überprüft, ob das erste ein char
ist '-'
, aber gibt es andere Möglichkeiten?
java
floating-point
zero
e4lime
quelle
quelle
Antworten:
Ja, teile es.
1 / +0.0f
ist+Infinity
, aber1 / -0.0f
ist-Infinity
. Mit einem einfachen Vergleich können Sie leicht herausfinden, um welches es sich handelt. Sie erhalten also:if (1 / x > 0) // +0 here else // -0 here
(Dies setzt voraus, dass
x
nur eine der beiden Nullen sein kann)quelle
if (math.copySign (1.0, x) < 0.0) ...
math.copySign(1.0,x)<0.0
"einfacher" ist als1/x>0
. Ich meine, beide sind ziemlich selbsterklärend, also möchten Sie sowieso eine Funktion dafür habenSie können
Float.floatToIntBits
es in ein konvertierenint
und das Bitmuster betrachten:float f = -0.0f; if (Float.floatToIntBits(f) == 0x80000000) { System.out.println("Negative zero"); }
quelle
(Float.floatToIntBits(f) & 0x80000000) < 0
Auf jeden Fall nicht der beste Ansatz. Überprüfen Sie die Funktion
Doku:
/** * Returns a representation of the specified floating-point value * according to the IEEE 754 floating-point "single format" bit * layout, preserving Not-a-Number (NaN) values. * * <p>Bit 31 (the bit that is selected by the mask * {@code 0x80000000}) represents the sign of the floating-point * number. ... public static native int floatToRawIntBits(float value);
quelle
Double.equals
unterscheidet ± 0,0 in Java. (Es gibt auchFloat.equals
.)Ich bin ein bisschen überrascht, dass niemand diese erwähnt hat, da sie mir klarer erscheinen als jede bisher angegebene Methode!
quelle
Der von verwendete Ansatz
Math.min
ähnelt dem, was Jesper vorschlägt, ist jedoch etwas klarer:private static int negativeZeroFloatBits = Float.floatToRawIntBits(-0.0f); float f = -0.0f; boolean isNegativeZero = (Float.floatToRawIntBits(f) == negativeZeroFloatBits);
quelle
Wenn ein Float negativ ist (einschließlich
-0.0
und-inf
), verwendet er dasselbe Vorzeichenbit wie ein negatives int. Dies bedeutet, dass Sie die Ganzzahldarstellung mit vergleichen können0
, sodass Sie die Ganzzahldarstellung nicht kennen oder berechnen müssen von-0.0
:if(f == 0.0) { if(Float.floatToIntBits(f) < 0) { //negative zero } else { //positive zero } }
Das hat einen zusätzlichen Zweig über der akzeptierten Antwort, aber ich denke, es ist besser lesbar ohne eine Hex-Konstante.
Wenn Ihr Ziel nur darin besteht, -0 als negative Zahl zu behandeln, können Sie die äußere
if
Aussage weglassen:if(Float.floatToIntBits(f) < 0) { //any negative float, including -0.0 and -inf } else { //any non-negative float, including +0.0, +inf, and NaN }
quelle
Für negativ:
new Double(-0.0).equals(new Double(value));
Für positiv:
new Double(0.0).equals(new Double(value));
quelle