web-dev-qa-db-fra.com

Comment vérifier si un zéro est positif ou négatif?

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?

72
e4lime

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)

79
harold

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");
}
37
Jesper

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);
12
andre baresel

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!

8
Reuben Thomas

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);
7
assylias

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
}
6
Kip

Pour négatif:

new Double(-0.0).equals(new Double(value));

Pour positif:

new Double(0.0).equals(new Double(value));
0
Tridib