2011-03-18 14 views
32

Tanto en OS X como en iOS, Apple usa el tipodef de CGFloat para obtener automáticamente un float en sistemas de 32 bits y un double en sistemas de 64 bits. Pero cuando usa las funciones matemáticas normales de Unix, debe tomar esa decisión caso por caso.CGFloat-based math functions?

Por ejemplo la función floor() se define como:

double floor(double x);

y la función floorf() se define como:

float floorf(float x);

Conozco todas iOS dispositivos son de 32 bits hoy, pero la razón para usar CGFloat es obtener una precisión mejorada automáticamente cuando el primer dispositivo de iOS de 64 bits se presentan (iPad 5?) y no tener que cambiar ningún código. Pero para que esto sea posible necesitamos funciones matemáticas basadas en CGFloat:

CGFloat Floor(CGFloat x);

¿Hay algún funciones como la de iOS o cualquier bibliotecas de terceros? ¿O cómo lo manejan otros desarrolladores? Sospecho que la mayoría está usando CGFloat junto con las float -versions en iOS pero luego "necesitarías" cambiar cada línea con una función matemática si compilas para un dispositivo iOS de 64 bits (y manejar dos versiones diferentes de tu base de código)

O simplemente podría usar float en lugar de CGFloat en todas partes y no preocuparse por iOS de 64 bits. Pero entonces tendrías inconsistencia con las bibliotecas de Apple y el código más feo de mi humilde opinión.

O quizás podría usar CGFloat junto con las double -versions y simplemente aprovechar el espacio y el rendimiento de permitir que el compilador se convierta entre el doble y flotar todo el tiempo. Y no le importan las posibles advertencias de "Conversión implícita a tipo de 32 bits".

O tal vez la mejor estrategia, apuesta en ninguna versión de 64 bits de iOS llegará algún día (o al menos en un futuro bastante cercano) y utilizar CGFloat junto con float -versions de las funciones matemáticas Unix y no preocuparse por la futuro.

¿Qué estrategia estás usando?

Respuesta

50

Editar: ¡Así que esta pregunta ya no es teórica ahora que tenemos iOS de 64 bits!

Creo que la manera más fácil de manejar esto es usar tgmath.h, en lugar de math.h (math.h es importado por Cocoa automáticamente, tgmath no lo hace, por lo que tendrá que declararlo en alguna parte).

Hay una serie de posibles soluciones discutidos en la lista de correo de cacao hilo: http://www.cocoabuilder.com/archive/cocoa/291802-math-functions-with-cgfloat.html

estoy de acuerdo con la mayoría de la gente en esa lista que tgmath es probablemente el camino a seguir. Creo que originalmente estaba pensado para permitir una fácil migración del código de Fortran, pero también funciona en este escenario.TGMath le permitirá hacer:

double floor(double x); 
float floor(float x); 
long double floor(long double x); 
+7

Gracias! Usar #include es exactamente lo que tenía en mente y también es una solución estándar (parte de C99). Aparentemente "tg" en significa Tipo Genérico. Debería ser señalado por Apple en los documentos si me preguntas. –

0

Si uno utiliza la precisión requerida por la aplicación (que ya puede estar por debajo de los límites de resolución de percepción humana), y puede conseguir una precisión numérica adecuada cuando el supuesto de que CGFloats no son más que una sola flotantes de precisión, luego cualquier actualización futura de la API para duplicar no comprará ese código existente ninguna mejora necesaria (visible, audible).