基于CGFloat的math函数?

在OS X和iOS中,Apple都使用CGFloat typedef自动在32位系统上获取float ,在64位系统上使用double 。 但是,当使用普通的Unixmath函数时,您需要根据具体情况做出决定。

例如, floor()函数被定义为:

double floor(double x);

floorf()函数的定义如下:

float floorf(float x);

我知道现在所有的iOS设备都是32位的,但是使用CGFloat的原因是在引入第一个64位iOS设备(iPad 5?)时自动提高精度,而不必更改任何代码。 但是要做到这一点,我们需要基于CGFloat的math函数:

CGFloat Floor(CGFloat x);

在iOS或任何第三方库中是否有这样的function? 或者其他开发人员如何处理? 我怀疑大多数是在iOS上使用CGFloatfloat -versions,但是如果为64位iOS设备编译(并处理代码库的两个不同版本),那么您将需要使用math函数更改每行)。

或者你可以使用float而不是CGFloat ,而不用担心64位的iOS。 但是,那么你会得到与苹果的图书馆和恕我直言的代码不一致。

或者你也许可以使用CGFloatdouble -versions一起,只需要让编译器在double和float之间转换的空间和性能一直保持不变。 而不关心可能的“隐式转换为32位types”的警告。

或者,也许最好的策略是,没有64位版本的iOS将会到来(或者至less在接近未来的时候),并且将CGFloat与Unixmath函数的float一起使用,而不用担心未来。

你使用什么策略?

编辑:所以这个问题不再是理论,现在我们有64位的iOS!

我认为最简单的方法是使用tgmath.h ,而不是math.h (math.h是由Cocoa自动导入的,tgmath不会,所以你需要在某处声明)。

Cocoa邮件列表讨论了许多可能的解决scheme: http : //www.cocoabuilder.com/archive/cocoa/291802-math-functions-with-cgfloat.html

我同意那个名单上的大多数人认为tgmath可能是要走的路。 我相信最初的目的是允许轻松移植Fortran代码,但在这种情况下也适用。 TGMath会让你做:

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

如果使用应用程序所需的精度(可能已经低于人类感知分辨率的限制),并且在假定CGFloats不超过单精度浮点数的情况下可以获得适当的数值精度,则任何未来的API升级都不会超过单精度浮点数购买任何需要(可见,可听见)改进的现有代码。