Pasé cerca de 2 horas rastreando un error hoy y lo habría encontrado mucho más rápido si Java hubiera lanzado una excepción al comparar NaN con un flotador. Sería bueno si pudiera protegerme de esto en el futuro. Cualquier ayuda es apreciada.¿Puedo hacer que Java arroje una excepción al hacer una comparación entre carrozas cuando una de ellas resulta ser NaN?
Respuesta
El JVM instruction set reference específicamente no permite que los códigos de bytes que hacen matemática de coma flotante arrojen excepciones y especifica rígidamente cómo deberían funcionar cuando NaN es un operando. Si hay una forma de hacerlo, o bien le pedirá que explícitamente lanzar excepciones en NaN o utilizar un compilador personalizado para insertar estos controles por usted.
Una opción que podría ser útil sería escribir una función como esta:
public static float check(float value) {
if (Float.isNaN(value))
throw new ArithmeticException("NaN");
return value;
}
Con esto, se puede escribir código para este efecto:
float f = check(myOtherFloat/yetAnotherFloat);
Esto luego hacer el cómputo y lanzar un error. Idealmente con un nombre de función corto, no será demasiado molesto.
W
La protección en flotante o doble es hacer que el resultado sea NaN o falso. Si desea detectar NaN, es mejor que evite el valor en primer lugar, por ejemplo, 0/0. Cuando haces una división, busca 0 como un divisor y lanza una excepción si es así. Puede envolver esto con un método de ayuda para simplificar.
public static double div(double a, double b) {
if(b == 0) throw new IllegalArguementException();
return a/b;
}
Si sé que el valor puede ser 0 o más solamente, a menudo añadir un sesgo como
double d = a/(b + 1e-9);
Esto nunca produce NaN proporcionó b> = 0. Si a == 0, d = = 0. El sesgo a usar depende de la situación.
Me gusta esta idea, pero ¿qué hay de la multiplicación del infinito por cero? ¿Harías lo mismo durante la multiplicación? – templatetypedef
Buen punto. Quizás puedas evitar tener el infinito. –
- 1. Declaración Bash if: ¿Puedo hacer una asignación y una comparación?
- 2. Cómo hacer una depuración una excepción al apagar el pitón
- 3. ¿Hay alguna función PHP nativa que arroje una Excepción incorporada?
- 4. Problemas al hacer una comparación de cadenas en LINQ
- 5. ¿Cómo puedo hacer que una aplicación Java se actualice automáticamente?
- 6. ¿Cómo puedo hacer que parpadee una elipse?
- 7. ¿Cómo forzo al compilador de C# a lanzar una excepción cuando cualquier operación matemática produce 'NaN'?
- 8. Usando Java, ¿puedo hacer que una JVM genere otra, y luego hacer que la original salga?
- 9. ¿Puedo hacer una anotación Java que "amplíe" @SuppressWarnings?
- 10. Repetir una función en C# hasta que ya no arroje una excepción
- 11. Qué hacer con una excepción detectada
- 12. ¿Es posible que jQuery arroje una excepción cuando no se encuentra un elemento?
- 13. ¿Se puede hacer más que una comparación en una fecha en una búsqueda de Rails 3?
- 14. ¿Cómo puedo hacer que una miniatura <img> muestre una imagen de tamaño completo al hacer clic?
- 15. ¿Cómo hacer que STL arroje excepciones en lugar de aserciones?
- 16. ¿Cómo puedo hacer que una casilla de verificación esté predeterminada para ser "marcada" en Rails 1.2.3?
- 17. Java - Hacer una colección de objetos amigable
- 18. ¿Puedo hacer una solicitud de CURL al mismo servidor?
- 19. Estado del puntero a objeto después de que el nuevo constructor arroje una excepción - C++
- 20. ¿Puedo hacer una claveexterna al mismo modelo en django?
- 21. ¿Cómo puedo hacer que una UITableView deje de desplazarse
- 22. ¿Cómo puedo hacer una línea Cuando la declaración en haml
- 23. ¿Puedo hacer que un atributo de Moose escriba "una vez"?
- 24. ¿Cómo puedo hacer que una ventana LWJGL sea redimensionable?
- 25. ¿Puedo hacer una columna JTable sin bordes?
- 26. ¿Cómo puedo informar a sqlalchemy que genere un error cada vez que MySQL arroje una advertencia?
- 27. Java JTable - Hacer solo una columna editable
- 28. Hacer que una lista enlazada sea segura
- 29. ¿Se puede hacer que Unity no arroje SynchronizationLockException todo el tiempo?
- 30. ¿Cómo hacer que una ventana PyQT4 salte al frente?
Suena como que necesita una señalización NaN (SNAN), pero sospecho que no es posible. – Gabe
De hecho, [Java no es compatible con la comparación de señalización] (http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#35254). –