Confronto dei tipi di dati float e double nell'obiettivo C

Confronto dei tipi di dati float e double nell'obiettivo C


Quando si utilizza il tipo di dati double o float in un'app per iPhone, riscontro problemi con i confronti ">=" e "<=" perché quando a una variabile viene assegnato un numero inserito con una cifra decimale, ad esempio 4.2, float o double utilizzato nel confronto può effettivamente avere un valore come 4.1999998092651367. A causa di questa differenza, un confronto come ">=4.2" è falso anziché vero. Come posso evitare questo problema?


Risposte:



Non può . farà . Per essere precisi:


float f = 4.2;  // f is exactly 4.19999980926513671875
double d = 4.2; // d is exactly 4.20000000000000017763568394002504646778106689453125

Il problema arriva quando scrivi qualcosa come:


float f = 4.2;
if (f >= 4.2) {
// this block of code is not executed.
}

f è esattamente 4.19999980926513671875 , ma lo stai confrontando con il valore letterale a doppia precisione "4.2", che ha il valore 4.20000000000000017763568394002504646778106689453125 , quindi il confronto non riesce. Se invece si confronta con il letterale di precisione singola "4.2f":


float f = 4.2;
if (f >= 4.2f) {
// this block of code is exectued.
}

il confronto riesce, perché i valori sono esattamente uguali. La virgola mobile è complicata, ma è del tutto deterministica; una delle cose più semplici che puoi fare per renderlo più intuitivo è non mescolare le precisioni. Se stai lavorando con float , assicurati che tutti i tuoi valori letterali abbiano il suffisso f per renderli anche di precisione unica.


(Questo può anche migliorare le prestazioni, ma non è questo il motivo per farlo; il motivo per farlo è perché renderà il tuo codice più corretto).