CGFloatベースの数学関数?質問する

CGFloatベースの数学関数?質問する

OS X と iOS の両方で、Apple は CGFloat typedef を使用して、float32 ビット システムでは を、double64 ビット システムでは を自動的に取得します。ただし、通常の 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 を気にせずに、どこでもfloatinsteadを使用することもできます。ただし、そうすると、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);

おすすめ記事