CGFloat:圆形,底部,abs和32/64位精度

时间:2011-10-08 05:08:28

标签: objective-c cgfloat

TLDR:如何在没有警告的情况下编译32位和64位CGFloats的方式调用标准浮点代码?


CGFloat定义为double或float,具体取决于编译器设置和平台。我正在尝试编写在两种情况下都能正常工作的代码,而不会产生很多警告。

当我使用floor,abs,ceil等简单浮点运算等函数时,会收到关于值被截断的警告。例如:

  

警告:隐式转换将64位值缩短为32位值

我不关心计算的正确性或精度损失,因为我意识到我可以一直使用所有函数的双精度版本(floor而不是floorf等);但是,我必须容忍这些错误。

有没有办法干净地编写支持32位和64位浮点数的代码,而不必使用大量的#ifdef __ LP64 __,或者为所有标准浮点函数编写包装函数?

2 个答案:

答案 0 :(得分:19)

您可以使用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 :(得分:3)

如果您只需要一些功能,则可以使用此功能:

#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