2011-03-18 53 views
32

在OS X和iOS中,Apple都使用CGFloat typedef在32位系統上自動獲取float,在64位系統上自動獲取double。但是當使用普通的Unix數學函數時,你需要根據具體情況做出決定。基於CGFloat的數學函數?

例如,floor()函數被定義爲:

double floor(double x);

floorf()功能被定義爲:

float floorf(float x);

我知道所有iOS設備都是32位的今天,但使用CGFloat的原因是當第一個64位iOS設備(iPad 5?),而不必更改任何代碼。但要做到這一點,我們需要根據CGFloat的-數學函數:

CGFloat Floor(CGFloat x);

是否有像在iOS或任何第三方庫的任何功能?或者其他開發人員如何處理?我懷疑大多數人在iOS上使用CGFloat以及float -versions,但是如果編譯爲64位iOS設備(並處理代碼庫的兩個不同版本),則需要使用數學函數更改每一行)。

或者你可以只使用float而不是CGFloat,而不用擔心64位iOS。但是,那麼你會與Apple的庫和恕我直言的代碼不一致。

或者你也許可以使用CGFloat加上double -versions,只需要讓編譯器在double和float之間始終轉換的空間和性能。而不關心可能的「隱式轉換爲32位類型」警告。

或許是最好的策略,iOS上的沒有64位版本的賭注永遠不會到達(或至少在不久的將來不夠),並與Unix的數學函數float -versions一起使用CGFloat,而不是擔心未來。

您使用什麼策略?

回答

50

編輯:所以這個問題已不再是理論,現在我們有64位的iOS!

我認爲處理這個問題的最簡單方法是使用tgmath.h而不是math.h(math.h由Cocoa自動導入,tgmath不會,因此您需要將它聲明在某處)。

有許多在可可郵件列表線程討論可能的解決方案: 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); 
+7

謝謝!使用#include 正是我想到的,它也是一個標準解決方案(C99的一部分)。顯然,「tg」在代表類型通用。如果你問我,蘋果應該在文檔中指出。 – 2011-03-18 14:09:32

0

如果一個使用應用程序所需的精度(可能已經低於限制人類感知分辨率),並能得到適當的數值精度假設CGFloats沒有多單的時候精確的浮點數,那麼任何未來的API升級將不會購買任何需要的(可見的,可聽見的)改進的現有代碼。