Rlocation de `fabs`,` fmax`, etc. pour une utilisation avec CGFloat sur les appareils iOS 64 bits

Question

Considérez le code de disposition comme ceci:

CGFloat descriptionHeight = // height of a paragraph of text with zero or more words; CGFloat imageHeight = // height of an image; CGFloat yCoordinateOfSomeOtherView = fmax(descriptionHeight, imageHeight) + 5.0f; 

Comment la troisième ligne doit-elle être réécrite avec la prise en charge des périphériques iOS 64 bits?

(Le code actuel ne prend pas en count si yCoordinateOfSomeOtherView est un float ou un double .)

Options

Quelques options (je ne suis pas sûr de ce qui est le mieux):

1. Définir ma propre macro

 #if defined(__LP64__) && __LP64__ #define cgfmax(x,y) fmaxf(x,y) #else #define cgfmax(x,y) fmax(x,y) #endif 

Je pourrais alors replace fmax par cgfmax .

2. Utilisez tgmath.h

Cette réponse Stack Overflow de 2011 suggère de replace math.h par tgmath.h . Cela remplace l'implémentation de fmax par celle qui appelle __typeof__ sur chaque argument et renvoie fmax ou fmaxf fonction des types d'arguments.

3. Ignorer ce problème

Puisque les CGFloats se rapportent à la layout, la perte de données potentiellement encourue en stockant un float dans un double sera généralement insignifiante. Autrement dit, ils représenteront de minuscules fractions de pixels.

Résumé

Je cherche d'autres options ou des conseils utiles de quelqu'un qui a déjà fait une transition de 32 bits vers 64 bits.

Il n'y a jamais de perte de données lors de la conversion d'un float en double . Cette conversion est toujours exacte.

Vos solutions 1 et 2 sont entièrement sémantiquement équivalentes, bien que (2) soit plus correct sur le plan stylistique.

Votre solution 3 n'est formellement pas équivalente; cela peut entraîner des conversions supplémentaires entre float et double, ce qui peut le rendre légèrement less efficace (mais le résultat actuel est identique).

Fondamentalement, cela n'a pas d'importance, mais utilisez tgmath .