Perché Splint (il controllo del codice C) restituisce un errore quando confronta un float con un int?

StackOverflow https://stackoverflow.com/questions/38027

  •  09-06-2019
  •  | 
  •  

Domanda

Entrambi sono valori matematici, tuttavia il float ha maggiore precisione.È questa l'unica ragione dell'errore: la differenza di precisione?O c'è un altro potenziale (e più serio) problema?

È stato utile?

Soluzione

È perché l'insieme di valori interi non è uguale all'insieme di valori float per i tipi "int" e "float".Ad esempio, il valore float 0,5 non ha eguali nell'insieme di numeri interi e il valore intero 4519245367 potrebbe non esistere nell'insieme di valori che un float può memorizzare.Quindi, il controllore segnala questo come un problema che deve essere controllato dal programmatore.

Altri suggerimenti

Perché probabilmente non è una buona idea.Non tutti i float possono essere troncati in interi;non tutti gli interi possono essere convertiti in float.

Quando si esegue il confronto, il valore intero verrà "promosso" a valore in virgola mobile.A quel punto stai eseguendo un confronto esatto dell'uguaglianza tra due numeri in virgola mobile, il che è quasi sempre una cosa negativa.

In genere dovresti avere una sorta di "palla epsilon", o intervallo di valori accettabili, e fai il confronto se i due valori sono abbastanza vicini tra loro da essere considerati uguali.Hai bisogno di una funzione più o meno come questa:

int double_equals(double a, double b, double epsilon)
{
   return ( a > ( b - epsilon ) && a < ( b + epsilon ) );
}

Se la tua applicazione non ha una scelta ovvia di epsilon, usa DBL_EPSILON.

Poiché i float non possono memorizzare un valore int esatto, quindi se hai due variabili, int i e float f, anche se assegni "i = f;", il confronto "if (i == f)" probabilmente non lo farà restituire vero.

Supponendo numeri interi con segno e formato a virgola mobile IEEE, le grandezze dei numeri interi che possono essere rappresentati sono:

short  -> 15 bits
float  -> 23 bits
long   -> 31 bits
double -> 52 bits

Pertanto a float può rappresentare qualsiasi short e un double può rappresentare qualsiasi long.

Se hai bisogno di aggirare questo problema (hai una ragione legittima e sei felice che nessuno dei problemi menzionati nelle altre risposte sia un problema per te), allora passa da un tipo all'altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top