2011-10-08 9 views
11

TLDR:32ビットと64ビット両方のCGFloatを警告なしでコンパイルする方法で標準浮動小数点コードを呼び出すにはどうすればよいですか?CGFloat:round、floor、abs、および32/64ビット精度


CGFloatは、コンパイラの設定とプラットフォームに応じて、doubleまたはfloatのいずれかとして定義されます。私は、多くの警告を生成せずに、両方の状況でうまく動作するコードを作成しようとしています。

floor、abs、ceilなどの単純な浮動小数点演算のような関数を使用すると、値が切り捨てられるという警告が表示されます。例えば:

警告:暗黙的な変換は私ことを理解するように、私は、計算の精度の正確さまたは損失心配はないです32ビット値

に64ビット値を短縮常にすべての関数の倍精度バージョンを使用できます(floorfではなくfloorなど)。しかし、私はこれらのエラーを許容する必要があります。

多くの#ifdef __ LP64 __を使用することなく、またはすべての標準浮動小数点関数のラッパー関数を書くことなく、32ビットと64ビットの両方の浮動小数点をサポートするコードをきちんと記述する方法はありますか?

答えて

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-based-math-functions – 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 
関連する問題