¿Funciones matemáticas basadas en CGFloat?

Tanto en OS X como en iOS, Apple está usando 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.

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

Sé que todos los dispositivos iOS son de 32 bits en la actualidad , pero la razón para usar CGFloat es obtener una precisión mejorada automáticamente cuando se introducen los primeros dispositivos iOS de 64 bits (¿iPad 5?) Y no tener que cambiar ningún código. Pero para hacerlo posible, necesitamos funciones matemáticas basadas en CGFloat:

CGFloat Floor(CGFloat x);

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

O simplemente podría usar float lugar de CGFloat 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 tal vez podría usar CGFloat junto con las double versiones y solo tomar el espacio y el rendimiento de permitir que el comstackdor 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, apostar a que ninguna versión de 64 bits de iOS llegará (o al menos en un futuro lo suficientemente cercano) y usar CGFloat junto con float -versions de las funciones matemáticas de Unix y no preocuparse por el futuro.

¿Qué estrategia estás usando?

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

Creo que la forma más fácil de lidiar con 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 discutidas en el hilo de la lista de correo de Cocoa: http://www.cocoabuilder.com/archive/cocoa/291802-math-functions-with-cgfloat.html

Estoy de acuerdo con la mayoría de las personas 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 te dejará hacer:

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

Si uno utiliza la precisión requerida por la aplicación (que puede estar ya por debajo de los límites de la resolución perceptual humana) y puede obtener una precisión numérica adecuada al suponer que CGFloats no son más que simples flotantes de precisión, cualquier actualización futura de la API al doble no lo hará compre ese código existente cualquier mejora necesaria (visible, audible).