基于CGFloat的数学函数?

时间:2011-03-18 13:12:59

标签: ios objective-c iphone

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

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

double floor(double x);

并且floorf()函数定义为:

float floorf(float x);

我知道所有的iOS设备都是32位今天,但是使用CGFloat的原因是在引入第一批64位iOS设备(iPad 5?)时自动提高精度不得不改变任何代码。但为了实现这一点,我们需要基于CGFloat的数学函数:

CGFloat Floor(CGFloat x);

在iOS或任何第三方库中是否有类似的功能?或者其他开发者如何处理这个?我怀疑大多数人都在iOS上使用CGFloatfloat - 版本,但是如果编译64位iOS设备(并处理),你将“需要”用数学函数更改每一行两个不同版本的代码库。)

或者您可以在任何地方使用float代替CGFloat而不用担心64位iOS。但是,你会发现与Apple的库和恕我直言的丑陋代码不一致。

或者您可以将CGFloatdouble - 版本一起使用,并且只需要让编译器一直在double和float之间进行转换,从而获得空间和性能。而不是关心可能的“隐式转换为32位类型”警告。

或者也许是最好的策略,不打赌任何64位版本的iOS都会到来(或者至少在未来足够的时候)并且与CGFloat一起使用float - Unix的版本数学功能,而不是担心未来。

你使用什么策略?

1 个答案:

答案 0 :(得分:51)

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

我认为解决这个问题的最简单方法是使用tgmath.h而不是math.h(math.h会自动导入Cocoa,但是tgmath不是这样,你需要声明它某处)。

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

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

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