81 votes

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

Est-il possible de vérifier si une float est un zéro positif (0.0) ou négatif zéro (-0.0)?

J'ai converti l' float d'un String et vérifié si la première char est '-', mais existe-il d'autres moyens?

82voto

harold Points 14256

Oui, diviser par elle. 1 / +0.0f est +Infinity, mais 1 / -0.0f est -Infinity. Il est facile de savoir de laquelle il s'agit d'une simple comparaison, de sorte que vous obtenez:

if (1 / x > 0)
    // +0 here
else
    // -0 here

(ce qui suppose que x ne peut être l'un des deux zéros)

42voto

Jesper Points 65733

Vous pouvez utiliser Float.floatToIntBits de les convertir en int et de regarder la séquence de bits:

float f = -0.0f;

if (Float.floatToIntBits(f) == 0x80000000) {
    System.out.println("Negative zero");
}

12voto

andre baresel Points 91

Franchement pas la meilleure approche. La caisse de 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);

10voto

assylias Points 102015

L'approche utilisée par Math.min est similaire à ce que Jesper propose mais un peu plus clair:

private static int negativeZeroFloatBits = Float.floatToRawIntBits(-0.0f);

float f = -0.0f;
boolean isNegativeZero = (Float.floatToRawIntBits(f) == negativeZeroFloatBits);

8voto

Kip Points 37013

Quand un flotteur est négatif (y compris -0.0 et -inf), il utilise le même bit de signe comme un négatif de type int. Cela signifie que vous pouvez comparer la représentation entière à l' 0, éliminant le besoin de savoir 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
  }
}

Qui a une branche au cours de la accepté de répondre, mais je pense que c'est plus lisible sans un hex constante.

Si votre but est juste de traiter -0 comme un nombre négatif, vous pouvez laisser l'extérieur if déclaration:

if(Float.floatToIntBits(f) < 0) {
  //any negative float, including -0.0 and -inf
} else {
  //any non-negative float, including +0.0, +inf, and NaN
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X