Pregunta

¿O existe la posibilidad de que la operación falle?

Gracias.

Elegí el término incorrecto y lo que realmente quise decir fue redondear a 0, no truncamiento.

El punto es que necesito comparar la parte entera de dos dobles y solo los estoy convirtiendo en int y luego usando ==, pero, como alguien señaló en una de mis preguntas anteriores, esto podría generar un desbordamiento excepción si el doble no puede caber en el entero.

Entonces, la pregunta sería '¿Es correcto usar el operador == para comparar dos dobles que previamente se han redondeado a 0, o debería apegarme al método de conversión a int y detectar una posible excepción?

¿Fue útil?

Solución

Aquí está el sitio actualizado que analiza los pros y los contras de varios métodos para comparar números de coma flotante. (Aún puede ver el sitio antiguo aquí .)

El método con el que iría es el "error relativo" método. Encuentre la diferencia entre los dos números, conviértalo a un porcentaje de los números, y si ese porcentaje es suficientemente pequeño, entonces tiene igualdad.

Otros consejos

Aún peor es que a veces, incluso por el mismo número exacto, fallará. Esto se debe a que algunos compiladores o procesadores usarán más bits de precisión en un registro de CPU que en la memoria (MSVC tiene 3 opciones diferentes de comportamiento de punto flotante, por ejemplo). Por lo tanto, un valor calculado recientemente puede no tener estos bits truncados y parecerá ser desigual. NUNCA use == en flotadores.

Todavía puede fallar debido a los problemas normales con la representación de coma flotante. En lugar de truncarlos, use un delta que represente la precisión equivalente.

Puede fallar en los casos en que tenga dos flotadores que normalmente consideraría lo mismo,

  
    

10.19999999

         

10.20000001

  

pero cuando los trunca dan resultados diferentes.

  
    

10.19

         

10.20

  

Mientras que, si hubiera usado un delta de 0.001 para comparar con la diferencia, habría visto que estos dos valores son efectivamente los mismos.

Nunca es correcto usar == con coma flotante.

¿Qué hace " truncar " significa en un contexto de coma flotante? ¿Qué función de biblioteca específica estás llamando? Cual es el resultado? Lo que te hace creer que "truncado" Qué valores son más comparables que los valores no truncados?

El punto flotante es una aproximación de valores decimales. El punto flotante solo puede representar potencias de dos con precisión. Todos los demás valores están sujetos a algún error, sin importar las operaciones de punto flotante que realice.

Sin embargo, si convierte a entero, puede usar == .

Si su valor absoluto es menor que 2 ^ 23 para simple o 2 ^ 52 para doble, puede usar round () y luego hacer la comparación. Los valores más grandes no se pueden almacenar con precisión y esto se abre para situaciones en las que N == N + 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top