32 votes

CGFloat de mathématiques sur les fonctions?

Dans les deux OS X et iOS, Apple est à l'aide de la CGFloat typedef pour obtenir automatiquement une float sur les systèmes 32 bits et un double sur les systèmes 64 bits. Mais lors de l'utilisation de la normale Unix mathématiques fonctions dont vous avez besoin pour prendre une décision au cas par cas.

Par exemple, l' floor() fonction est définie par:

double floor(double x);

et l' floorf() fonction est définit comme:

float floorf(float x);

Je sais que tous les appareils iOS sont de 32-bit aujourd'hui, mais la raison d'utiliser des CGFloat est automatiquement obtenir une meilleure précision lors de la première 64-bit iOS dispositifs sont mis en place (iPad 5?) et ne pas avoir à changer le code. Mais pour rendre cela possible, nous avons besoin CGFloat de mathématiques sur les fonctions:

CGFloat Floor(CGFloat x);

Existe-il des fonctions comme dans d'iOS ou de tout tiers bibliothèques? Ou comment faire d'autres développeurs de gérer cela? Je soupçonne la plupart sont soit à l'aide d' CGFloat ensemble avec l' float-versions sur iOS, mais alors vous devez avoir besoin de modifier chaque ligne avec une fonction mathématique si la compilation pour un 64 bits appareil iOS (et poignée en deux versions différentes de votre base de code).

Ou vous pouvez simplement utiliser float au lieu de CGFloat partout et de ne pas se soucier 64-bit iOS. Mais alors, vous obtiendrez incohérence avec Apple bibliothèques et à mon humble avis plus laide du code.

Ou vous pourriez peut-être utiliser CGFloat ensemble avec l' double-versions et il suffit de prendre l'espace et les performances de laisser le compilateur convertir entre double et float tout le temps. Et ne pas se soucier de possibles "conversion Implicite à 32 Bits de Type" mises en garde.

Ou peut-être la meilleure stratégie, parier sur les pas de version 64 bits de iOS va jamais arriver (ou au moins dans un assez proche avenir) et l'utilisation CGFloat avec float-versions d'Unix, fonctions mathématiques et de ne pas se soucier de l'avenir.

Quelle stratégie utilisez-vous?

51voto

lxt Points 22990

Edit: Donc, cette question n'est plus théorique maintenant que nous avons 64-bit iOS!

Je pense que la meilleure façon de traiter cette question est d'utiliser tgmath.h, au lieu de math.h (math.h importés par le Cacao automatiquement, tgmath n'a pas de sorte que vous aurez besoin de le déclarer quelque part).

Il y a un certain nombre de solutions potentielles discuté à la de Cacao liste de diffusion thread: http://www.cocoabuilder.com/archive/cocoa/291802-math-functions-with-cgfloat.html

Je suis d'accord avec la majorité des gens sur cette liste que les tgmath est probablement la voie à suivre. Je crois qu'il était prévu à l'origine pour faciliter le portage de code Fortran, mais il travaille également dans ce scénario. TGMath vous permettra de faire:

double floor(double x);
float floor(float x);
long double floor(long double x);

0voto

hotpaw2 Points 40796

Si l'on utilise la précision requis par la demande (qui peut déjà être au-dessous de la limite de perception de l'homme de la résolution), et peut obtenir adapté précision numérique lorsqu'on fait l'hypothèse que CGFloats ne sont plus que de simple précision flotteurs, puis tout l'avenir de l'API mises à niveau double de ne pas acheter ce code existant nécessaires (visible, audible) l'amélioration.

0voto

Steven Kramer Points 6122

Utilisation de C++ surcharge d'opérateur si le problème lui permet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X