tengo una cadena que puedo convertir a un doble de esta manera:"-Weverything" ceder "Comparación de punto flotante con == o = no es seguro!"
double d = [string doubleValue];
La documentación para doubleValue
nos dice que ante un desbordamiento , este método devuelve HUGE_VAL
o -HUGE_VAL
. Así es como he comprobado para este anterior:
if (d == HUGE_VAL || d == -HUGE_VAL)
//overflow
Ahora, puesto que la adición de la nueva "-Weverything" Bandera de alerta, el compilador se queja de que ahora
Comparing floating point with == or != is unsafe
¿Cómo puedo resolver este problema? ¿Cómo debería Haré estas comparaciones?
que también tienen la misma pregunta sobre la comparación de dos números de coma flotante "normales" (es decir, no queridos "HUGE_VAL"). Por ejemplo,
double a, b;
//...
if (a != b) //this will now yield the same warning
//...
¿Cómo se debe resolver esto?
Tiene sentido. Por otro lado, también parece tener sentido advertir sobre esto, de alguna manera. ¿Hay alguna manera de decirle al compilador de manera más explícita que: "Sí, estoy absolutamente seguro de que estoy comparando estos flotadores como siendo exactamente iguales entre sí, y no me advierta". ? Entonces, en casos donde estoy seguro, la advertencia no aparecerá. En otros casos, yo haría la prueba épsilon. – NoobOverflow
@NoobOverflow Si realmente deseas hacer feliz al compilador, prueba si 'd> = HUGE_VAL || d <= -HUGE_VAL'. Calcula lo mismo sin usar '=='. Pero recomiendo no usar la advertencia. –
@NoobOverflow En realidad, mi recomendación anterior hace que el código sea menos legible, pero si Objective-C tiene una función 'is_infinity', usar eso haría que el código ** fuera más legible. La especificación de la función debería ser que devuelve verdadero exactamente para los dos valores 'HUGE_VAL' y' -HUGE_VAL', y recomiendo que lo use simplemente para eso. –