Domanda

I stava cercando di aggiungere alcuni valori CGFloat ricorsivamente nel mio programma. E ho appena realizzato in uno scenario particolare, il totale generato non era corretto. Per garantire che non avevo niente di sbagliato nella mia logica del programma, ho creato un semplice esempio di questo scenario (vedi sotto) e questo stampato lo stesso valore errato.

CGFloat arr[3] = {34484000,512085280,143011440};
CGFloat sum = 0.0;
sum = arr[0] + arr[1] + arr[2];

NSLog(@"%f",sum);

int arr1[3] = {34484000,512085280,143011440};
int sum1 = 0.0;
sum1 =  arr1[0] + arr1[1] + arr1[2];

NSLog(@"%d",sum1);

La prima NSLog stampa 689.580.736,000 mila ... mentre il risultato corretto 689580720. Tuttavia la seconda NSLog stampa il risultato corretto. Non sono sicuro se questo è un bug o se sto facendo qualcosa di sbagliato.

Grazie, Murali

È stato utile?

Soluzione

CGFloat è un singolo galleggiante precisione di 32 bit come bersagli IOS - ha solo una mantissa a 23 bit, cioè circa 6 - 7 cifre significative. Utilizzare un tipo double precision se avete bisogno di una maggiore precisione.

Si dovrebbe probabilmente letto Ciò che ogni computer Scientist di David Goldberg dovrebbero sapere su aritmetica alla virgola mobile prima di procedere molto più in là con imparare a programmare.

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