En JBox2d, existe el siguiente código para Vec2.equals()
:¿Por qué usar Float.floatToIntBits() en comparaciones de flotación de Java?
@Override
public boolean equals(Object obj) { //automatically generated by Eclipse
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Vec2 other = (Vec2) obj;
if (Float.floatToIntBits(x) != Float.floatToIntBits(other.x))
return false;
if (Float.floatToIntBits(y) != Float.floatToIntBits(other.y))
return false;
return true;
}
Me pregunto qué propósito el flotador < - funciones conversiones> int bits sirven, aquí. ¿Esto proporciona una forma de evitar el problema de inexactitud de la comparación de flotantes de Java (si es posible)? ¿O es algo completamente diferente? Me pregunto si es una alternativa al enfoque épsilon:
if (Math.abs(floatVal1 - floatVal2) < epsilon)
PS. en aras de la exhaustividad y el interés, aquí está Vec2.hashCode()
:
@Override
public int hashCode() { //automatically generated by Eclipse
final int prime = 31;
int result = 1;
result = prime * result + Float.floatToIntBits(x);
result = prime * result + Float.floatToIntBits(y);
return result;
}
FYI, puedo ver perfectamente por qué las funciones de conversión se utilizan en hashCode() - IDs de hash deben ser enteros.
En otras palabras, ¿esto es completamente superior al enfoque épsilon? No puedo creer mi suerte, si es así. –
Bueno, si puede garantizar que no obtendrá 'NaNs' o' -0.0' o infinitos, entonces el uso de 'Math.abs()
Veo a partir de los comentarios a continuación que estaba confundiendo lo que hace. Resuelve problemas centrados alrededor de los valores float especiales; no se ocupa de la inexactitud del flotador, como usted indicó inicialmente en su respuesta. Entonces ignora mi última pregunta. –