2011-10-08 73 views
11

TLDR:如何以無需警告編譯32位和64位CGFloats的方式調用標準浮點代碼?CGFloat:round,floor,abs和32/64位精度


根據編譯器設置和平臺,CGFloat被定義爲double或float。我試圖編寫在兩種情況下運行良好的代碼,而不會產生很多警告。

當我使用諸如floor,abs,ceil和其他簡單浮點運算的函數時,我收到了有關值被截斷的警告。例如:

警告:隱式轉換縮短64位的值成一個32位的值

我不關心正確性或在計算中的精度的損失,因爲我知道我可以隨時使用所有功能的雙精度版本(floorf代替floorf等);然而,我將不得不容忍這些錯誤。

有沒有一種方法可以乾淨地編寫支持32位和64位浮點數的代碼,而不必使用大量的#ifdef __ LP64 __,或者爲所有標準浮點函數編寫包裝函數?

回答

19

您可以使用tgmath.h中的那些函數。

#include <tgmath.h> 

... 

double d = 1.5; 
double e = floor(d); // will choose the 64-bit version of 'floor' 

float f = 1.5f; 
float g = floor(f); // will choose the 32-bit version of 'floorf'. 
+1

現在我知道該怎麼尋找,我發現這個問題:http://stackoverflow.com/questions/ 5352457 /基於cgfloat的數學函數 – leecbaker

+1

請注意,在Xcode 6.1中,如果啓用了模塊,則tgmath不起作用。請參閱http://stackoverflow.com/q/23333287/449161 –

3

如果您只需要幾個功能,您可以使用它代替:

#if CGFLOAT_IS_DOUBLE 
#define roundCGFloat(x) round(x) 
#define floorCGFloat(x) floor(x) 
#define ceilCGFloat(x) ceil(x) 
#else 
#define roundCGFloat(x) roundf(x) 
#define floorCGFloat(x) floorf(x) 
#define ceilCGFloat(x) ceilf(x) 
#endif