基于CGFloat的数学函数?

Påh*_*lin 32 iphone objective-c ios

在OS X和iOS中,Apple使用CGFloat typedef自动获取float32位系统和double64位系统.但是当使用普通的Unix数学函数时,您需要根据具体情况做出决定.

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

double floor(double x);

并且该floorf()函数定义为:

float floorf(float x);

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

CGFloat Floor(CGFloat x);

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

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

或者你可以CGFloatdouble-versions 一起使用,只需要让编译器一直在double和float之间进行转换.而不是关心可能的"隐式转换为32位类型"警告.

或者也许是最好的策略,没有任何64位版本的iOS的赌注将会到来(或者至少在未来足够的时候),CGFloat并与floatUnix数学函数的转换一起使用,而不用担心未来.

你用什么策略?

lxt*_*lxt 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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!使用#include <tgmath.h>正是我的想法,它也是一个标准的解决方案(C99的一部分).显然,<tgmath.h>中的"tg"代表Type Generic.如果你问我,应该在Apple的文档中指出. (7认同)