ho una stringa che converte ad una doppia come questo:"-Weverything" cedendo "Confronto in virgola mobile con == o = non è sicuro!"
double d = [string doubleValue];
La documentazione per doubleValue
ci dice che su di trabocco , questo metodo restituisce HUGE_VAL
o -HUGE_VAL
. Questo è il modo che ho controllato per questo in precedenza:
if (d == HUGE_VAL || d == -HUGE_VAL)
//overflow
Ora, dal momento che l'aggiunta del nuovo "-Weverything" bandiera di avvertimento, il compilatore ora lamenta che
Comparing floating point with == or != is unsafe
Come posso risolvere questo problema? Come dovrei sto facendo questi confronti?
Ho anche la stessa domanda sul confronto di due numeri in virgola mobile "normali" (cioè non "HUGE_VAL" quelli). Ad esempio,
double a, b;
//...
if (a != b) //this will now yield the same warning
//...
Come dovrebbe essere risolto?
Ha senso. D'altra parte, sembra anche sensato avvertire su questo, in qualche modo. C'è un modo per dire al compilatore in modo più esplicito che: "Sì, sono assolutamente sicuro che sto confrontando questi float come esattamente uguali tra loro e non mi avvisano". ? Quindi, nei casi in cui sono sicuro, l'avviso non verrà visualizzato. In altri casi, farei il test epsilon. – NoobOverflow
@NoobOverflow Se vuoi davvero rendere felice il compilatore, verifica se 'd> = HUGE_VAL || d <= -HUGE_VAL'. Calcola la stessa cosa senza usare '=='. Ma mi raccomando di non usare l'avvertimento. –
@NoobOverflow In realtà, la mia precedente raccomandazione rende il codice meno leggibile, ma se Objective-C ha una funzione 'is_infinity', l'uso di questo renderebbe il codice ** più ** leggibile. La specifica della funzione dovrebbe essere che ritorna true esattamente per i due valori 'HUGE_VAL' e' -HUGE_VAL', e ti consiglio di usarlo solo per quello. –