Objective c CGFloat:圆形、地板、abs和32/64位精度

Objective c CGFloat:圆形、地板、abs和32/64位精度,objective-c,cgfloat,Objective C,Cgfloat,TLDR:如何以编译32位和64位CGFLOAT而没有警告的方式调用标准浮点代码 CGFloat被定义为double或float,具体取决于编译器设置和平台。我正在尝试编写在这两种情况下都能正常工作的代码,而不会产生很多警告 当我使用诸如floor、abs、ceil和其他简单浮点操作之类的函数时,会收到关于值被截断的警告。例如: 警告:隐式转换将64位值缩短为32位值 我不担心计算的正确性或精度损失,因为我意识到我可以一直使用所有函数的双精度版本(floor而不是floorf,等等);然而,我

TLDR:如何以编译32位和64位CGFLOAT而没有警告的方式调用标准浮点代码


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

当我使用诸如floor、abs、ceil和其他简单浮点操作之类的函数时,会收到关于值被截断的警告。例如:

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

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


有没有一种方法可以干净地编写既支持32位浮点又支持64位浮点的代码,而不必使用大量的#ifdef uuu u u)LP64 u u,或者为所有标准浮点函数编写包装函数

您可以从中使用这些函数

#包括
...
双d=1.5;
双e=楼层(d);//将选择64位版本的“floor”
浮球f=1.5f;
浮球g=地板(f);//将选择32位版本的“floorf”。

如果您只需要几个功能,可以使用以下功能:

#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

现在我知道要搜索什么了,我发现了这个问题:请注意,在Xcode 6.1中,如果启用了模块,包括tgmath就没有帮助了。看见
#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