OS X と iOS の両方で、Apple は CGFloat typedef を使用して、float
32 ビット システムでは を、double
64 ビット システムでは を自動的に取得します。ただし、通常の Unix 数学関数を使用する場合は、ケースごとに決定する必要があります。
たとえば、floor()
関数は次のように定義されます。
double floor(double x);
関数はfloorf()
次のように定義されます。
float floorf(float x);
iOSデバイスはすべて32ビットであることは知っています今日しかし、CGFloat を使用する理由は、最初の 64 ビット iOS デバイス (iPad 5?) が導入されたときに、コードを変更することなく、自動的に精度が向上するためです。ただし、それを可能にするには、CGFloat ベースの数学関数が必要です。
CGFloat Floor(CGFloat x);
iOS やサードパーティのライブラリにそのような関数はありますか? または、他の開発者はこれをどのように処理していますか? ほとんどの開発者はiOS で -versionsCGFloat
を一緒に使用していると思われますfloat
が、64 ビット iOS デバイス用にコンパイルする場合は、すべての行を数学関数で変更する必要があります (コード ベースの 2 つの異なるバージョンを処理する必要があります)。
または、 64 ビット iOS を気にせずに、どこでもfloat
insteadを使用することもできます。ただし、そうすると、Apple のライブラリとの不整合が発生し、私見ではコードが醜くなります。CGFloat
または、 -versionsCGFloat
と一緒に使用しdouble
て、コンパイラが常に double と float の間で変換できるようにすることで、スペースとパフォーマンスが低下するのを防ぐこともできます。また、「32 ビット型への暗黙的な変換」警告が発生する可能性を気にする必要もありません。
あるいは、iOS の 64 ビット バージョンが今後登場しない (または少なくとも近い将来には登場しない) と賭けて、 Unix 数学関数の 64 ビット バージョンCGFloat
を併用し、将来について心配しないのが最善の戦略かもしれません。float
どのような戦略を採用していますか?
ベストアンサー1
編集: 64 ビット iOS がリリースされた今、この質問はもはや理論的なものではありません。
tgmath.h
これに対処する最も簡単な方法は、 の代わりにを使用することだと思いますmath.h
(math.h は Cocoa によって自動的にインポートされますが、 tgmath はインポートされないため、どこかで宣言する必要があります)。
Cocoa メーリング リストのスレッドでは、いくつかの潜在的な解決策が議論されています。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);