Pregunta

Estaba tratando de agregar algunos valores de CGFloat recursivamente en mi programa. Y me acabo de dar cuenta en un escenario particular que el total generado era incorrecto. Para asegurarme de que no tenía nada malo en la lógica de mi programa, creé un ejemplo simple de ese escenario (ver más abajo) y esto imprimí el mismo valor incorrecto.

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);

El primer NSLOG imprime 689580736.000000 ... mientras que el resultado correcto 689580720. Sin embargo, el segundo NSLOG imprime el resultado correcto. No estoy seguro de si esto es un error o si estoy haciendo algo mal.

Gracias Murali

¿Fue útil?

Solución

CGFloat es un solo flotador de precisión en objetivos de 32 bits como iOS: solo tiene una mantissa de 23 bits, es decir, alrededor de 6 a 7 dígitos significativos. Use un tipo de doble precisión si necesita mayor precisión.

Probablemente deberías leer a David Goldberg's Lo que todo informático debe saber sobre la aritmética de punto flotante antes de continuar mucho más lejos con el aprendizaje a programar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top