2013-10-21 23 views
11

問題

考慮這樣的佈局代碼:置換`fabs`,`fmax`等與CGFloat的使用64位的iOS設備

CGFloat descriptionHeight = // height of a paragraph of text with zero or more words; 
CGFloat imageHeight = // height of an image; 
CGFloat yCoordinateOfSomeOtherView = fmax(descriptionHeight, imageHeight) + 5.0f; 

如何應在第三行被改寫支持64位iOS設備?

(當前的代碼不考慮yCoordinateOfSomeOtherView是否是floatdouble

選項

有幾個選項(我不知道這是最好的):

1.定義我自己的宏

#if defined(__LP64__) && __LP64__ 
#define cgfmax(x,y) fmaxf(x,y) 
#else 
#define cgfmax(x,y) fmax(x,y) 
#endif 

我可以再與取代。

2.從2011年使用tgmath.h

This Stack Overflow answer建議用tgmath.h更換math.h。這將替換fmax的實現,其中每個參數調用__typeof__,並根據參數類型返回fmaxfmaxf

3.忽略這個問題

由於CGFloats涉及佈局,存儲floatdouble潛在發生的數據丟失通常是微不足道的。也就是說,它們將代表像素的極小部分。

摘要

我在尋找任何其他選項或從別人誰在做之前32位到64位的過渡有益的建議。

+1

是的,佈局的東西並沒有真正達到32位的限制。所以它可能不會成爲一個問題,但它的樂趣,爲未來的參考做心理練習。 –

回答

6

當將float轉換爲double時,從未發生任何「數據丟失」。這種轉換總是確切的。

您的解決方案1 ​​& 2在語義上完全等同,儘管(2)在風格上更爲正確。

您的解決方案3在形式上不等同;它可能會導致float和double之間的額外轉換,這可能會使效率稍微降低(但實際結果相同)。

基本上沒什麼關係,但是用tgmath

+0

對不起,我的意思是相反的。 (「數據丟失」是指64位值被分配給32位類型時的截斷值)。也就是說,兩個'double'將進入'fmax',並且'float'會出現出。 –

+0

@AaronBrager:當然,但在你的情況下,你知道'fmax'的參數最初是'CGFloat's,這意味着它們的最大值(返回值)可以完全表示爲'CGFloat',所以不可能有四捨五入。結果仍然是確切的。 –

+0

是的,我不擔心它(我個人只是使​​用'fmax'等),除非你測量一個真正的性能問題。 – Wevah