2011-10-08 10 views
11

TLDR: ¿Cómo puedo llamar al código de coma flotante estándar de manera que compila tanto CGFloats de 32 como de 64 bit sin advertencias?CGFloat: redondo, piso, abs y precisión de 32/64 bit


CGFloat se define como dobles o flotador, dependiendo de la configuración del compilador y la plataforma. Intento escribir código que funcione bien en ambas situaciones, sin generar muchas advertencias.

Cuando uso funciones como floor, abs, ceil y otras operaciones simples de coma flotante, recibo advertencias sobre la truncación de valores. Por ejemplo:

advertencia: conversión implícita acorta valor de 64 bits en un valor de 32 bits

No estoy preocupado por la corrección o la pérdida de precisión en los cálculos, ya que soy consciente de que me solo podría usar las versiones de doble precisión de todas las funciones todo el tiempo (piso en lugar de piso, etc.); Sin embargo, tendría que tolerar estos errores.

¿Existe alguna manera de escribir código que admita tanto flotantes de 32 bits como de 64 bits sin tener que usar una gran cantidad de #ifdef__PL64__ o escribir funciones de envoltura para todas las funciones de coma flotante estándar?

Respuesta

19

Puede usar esas funciones en tgmath.h.

#include <tgmath.h> 

... 

double d = 1.5; 
double e = floor(d); // will choose the 64-bit version of 'floor' 

float f = 1.5f; 
float g = floor(f); // will choose the 32-bit version of 'floorf'. 
+1

Ahora que sé qué buscar, encontré esta pregunta: http://stackoverflow.com/questions/ 5352457/cgfloat-based-math-functions – leecbaker

+1

Tenga en cuenta que en Xcode 6.1, incluir tgmath no ayuda si los módulos están habilitados. Ver http://stackoverflow.com/q/23333287/449161 –

3

Si sólo necesita un par de funciones que se pueden utilizar en su lugar:

#if CGFLOAT_IS_DOUBLE 
#define roundCGFloat(x) round(x) 
#define floorCGFloat(x) floor(x) 
#define ceilCGFloat(x) ceil(x) 
#else 
#define roundCGFloat(x) roundf(x) 
#define floorCGFloat(x) floorf(x) 
#define ceilCGFloat(x) ceilf(x) 
#endif