【问题标题】:CGFloat-based math functions?基于 CGFloat 的数学函数?
【发布时间】:2011-03-18 13:12:59
【问题描述】:

在 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-versions,但是如果为64位iOS设备编译(并处理两个不同版本的你的代码库)。

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

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

或者也许是最好的策略,赌 64 位版本的 iOS 永远不会到来(或至少在足够近的将来)并使用 CGFloatfloat-版本的 Unix 数学函数,而不是担心未来。

你使用什么策略?

【问题讨论】:

    标签: ios objective-c iphone


    【解决方案1】:

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

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

    在 Cocoa 邮件列表线程中讨论了许多潜在的解决方案: 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);
    

    【讨论】:

    • 谢谢!使用 #include 正是我的想法,它也是一个标准解决方案(C99 的一部分)。显然 中的“tg”代表通用类型。如果您问我,Apple 应该在文档中指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2012-06-13
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多