基于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上使用CGFloat
和float
-versions,但是如果为64位iOS设备编译(并处理代码库的两个不同版本),那么您将需要使用math函数更改每行)。
或者你可以使用float
而不是CGFloat
,而不用担心64位的iOS。 但是,那么你会得到与苹果的图书馆和恕我直言的代码不一致。
或者你也许可以使用CGFloat
和double
-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升级都不会超过单精度浮点数购买任何需要(可见,可听见)改进的现有代码。