2011-03-18 29 views
32

Hem OS X hem de iOS'ta, Apple, 32 bit sistemlerde float ve 64 bit sistemlerde double otomatik olarak almak için CGFloat typedef'i kullanır. Fakat normal Unix matematik fonksiyonlarını kullanırken, duruma göre bu kararı vermeniz gerekir. CGFloat tabanlı matematik işlevleri?

Örneğin floor() fonksiyonu şu şekilde tanımlanır:

double floor(double x);

gibi floorf() fonksiyonu tanımlamaktadır: I cihazlar bugün 32 bit olan tüm IOS bilmek

float floorf(float x);

, ancak CGFloat kullanmanın nedeni, ilk 64 bit iOS devic olduğunda otomatik olarak iyileştirilmiş hassasiyet elde etmektir. (iPad 5?) tanıtıldı ve herhangi bir kodu değiştirmeye gerek yok.

CGFloat Floor(CGFloat x);

iOS veya herhangi bir üçüncü taraf kitaplıklarında böyle herhangi işlevleri var mı: Ama biz CGFloat tabanlı matematik fonksiyonları ihtiyaç olanaklı hale getirmek için? Ya da diğer geliştiriciler bunu nasıl halleder? Çoğu, ya CGFloat'u iOS'ta float bölümleri ile birlikte kullandığından şüpheleniyorum, ancak 64 bitlik bir iOS aygıtı için derleme (ve kod tabanınızın iki farklı sürümünü ele alırsanız, her satırı bir matematik işleviyle değiştirmek için "ihtiyacınız" gerekir).

Ya da her yerde CGFloat yerine float'u kullanabilir ve 64 bit iOS için endişelenmezsiniz. Ama sonra Apple'ın kütüphaneleri ve IMHO çirkin kodları ile tutarsızlık alırsınız.

Veya double bölümleri ile birlikte CGFloat kullanın ve derleyicinin her zaman çift ve float arasında geçiş yapmasına izin verdiğiniz alanı ve performansı yakalayın. Ve olası "32 Bit Tipine örtük dönüştürme" uyarılarını önemsememek.

Ya da belki en iyi strateji

, iOS hiçbir 64-bit sürümünde bahis şimdiye kadar gelmesi (ya da en azından yakın bir gelecekte yeterli) ve Unix matematik fonksiyonlarının float -sürümleri birlikte CGFloat kullanmak ve endişesi olmayacak geleceği.

Hangi stratejiyi kullanıyorsunuz?

cevap

50

Düzenleme: Artık bu soru artık teorik değil, artık 64 bit iOS'umuz var!

Bunu yapmanın en kolay yolu, math.h yerine tgmath.h kullanmaktır (math.h otomatik olarak Cocoa tarafından içe aktarılır, tgmath bunu bir yere bildirmeniz gerekmez). http://www.cocoabuilder.com/archive/cocoa/291802-math-functions-with-cgfloat.html

ben tgmath bu listedeki kişilere çoğunluğu ile kabul edeceğini, muhtemelen gitmek için yoludur:

Kakao posta listesi parçacığı tartışılan olası çözümlerin vardır. Orijinal olarak Fortran kodunun kolay bir şekilde taşınmasına izin verdiğine inanıyorum, ancak bu senaryoda da çalışır.CGFloats tek fazla olduğunu varsayarak zaman bir (zaten limitler insan algısal çözünürlük altında olabilir) uygulamanın gerektirdiği hassasiyet kullanıyorsa

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

Teşekkürler! #include 'u kullanmak aklımda olanı ve aynı zamanda standart bir çözümdür (C99'un bir parçası). Görünüşe göre 'da "tg", Tip Jenerik anlamına gelir. Bana sorarsan, Apple tarafından dokümanlar tarafından belirtilmelidir. –

0

ve uygun sayısal doğruluk elde edebilirsiniz: TGMath yapmanız izin verir hassas şamandıralar, daha sonra gelecekteki herhangi bir API yükseltmesi, varolan kodu gerek duyulan (görünür, sesli) iyileştirmeyi satın almaz.