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?
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?
Antworten:
Ja, teile es. 1 / +0.0f
ist +Infinity
, aber 1 / -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)
if (math.copySign (1.0, x) < 0.0) ...
math.copySign(1.0,x)<0.0
"einfacher" ist als 1/x>0
. Ich meine, beide sind ziemlich selbsterklärend, also möchten Sie sowieso eine Funktion dafür haben
Sie können Float.floatToIntBits
es in ein konvertieren int
und das Bitmuster betrachten:
float f = -0.0f;
if (Float.floatToIntBits(f) == 0x80000000) {
System.out.println("Negative zero");
}
(Float.floatToIntBits(f) & 0x80000000) < 0
Auf jeden Fall nicht der beste Ansatz. Überprüfen Sie die Funktion
Float.floatToRawIntBits(f);
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);
Double.equals
unterscheidet ± 0,0 in Java. (Es gibt auch Float.equals
.)
Ich bin ein bisschen überrascht, dass niemand diese erwähnt hat, da sie mir klarer erscheinen als jede bisher angegebene Methode!
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önnen 0
, 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
}