Est-il possible de vérifier si un float
est un zéro positif (0,0) ou un zéro négatif (-0,0)?
J'ai converti le float
en String
et vérifié si le premier char
est un '-'
, mais existe-t-il d'autres moyens?
Oui, divisez-le. 1 / +0.0f
est +Infinity
, mais 1 / -0.0f
est -Infinity
. Il est facile de savoir lequel il s'agit avec une comparaison simple, vous obtenez donc:
if (1 / x > 0)
// +0 here
else
// -0 here
(cela suppose que x
ne peut être que l'un des deux zéros)
Vous pouvez utiliser Float.floatToIntBits
pour le convertir en int
et regardez le modèle de bits:
float f = -0.0f;
if (Float.floatToIntBits(f) == 0x80000000) {
System.out.println("Negative zero");
}
Certainement pas la meilleure approche. Commander la fonction
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
distingue ± 0,0 en Java. (Il y a aussi Float.equals
.)
Je suis un peu surpris que personne ne les ait mentionnés, car ils me semblent plus clairs que n'importe quelle méthode donnée jusqu'à présent!
L'approche utilisée par Math.min
est similaire à ce que propose Jesper mais un peu plus clair:
private static int negativeZeroFloatBits = Float.floatToRawIntBits(-0.0f);
float f = -0.0f;
boolean isNegativeZero = (Float.floatToRawIntBits(f) == negativeZeroFloatBits);
Lorsqu'un flottant est négatif (y compris -0.0
et -inf
), il utilise le même bit de signe qu'un entier négatif. Cela signifie que vous pouvez comparer la représentation entière à 0
, éliminant le besoin de connaître ou de calculer la représentation entière de -0.0
:
if(f == 0.0) {
if(Float.floatToIntBits(f) < 0) {
//negative zero
} else {
//positive zero
}
}
Cela a une branche supplémentaire par rapport à la réponse acceptée, mais je pense que c'est plus lisible sans constante hexadécimale.
Si votre objectif est simplement de traiter -0 comme un nombre négatif, vous pouvez laisser de côté l'instruction if
externe:
if(Float.floatToIntBits(f) < 0) {
//any negative float, including -0.0 and -inf
} else {
//any non-negative float, including +0.0, +inf, and NaN
}
Pour négatif:
new Double(-0.0).equals(new Double(value));
Pour positif:
new Double(0.0).equals(new Double(value));