Замена для `fabs`,` fmax` и т.д. Для использования с CGFloat на 64-битных iOS-устройствах
Вопрос
Рассмотрим код макета следующим образом:
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;
Как следует переписать третью строку с поддержкой 64-разрядных iOS-устройств?
(В текущем коде не учитывается, является ли yCoordinateOfSomeOtherView
float
или double
.)
Функции
Несколько вариантов (я не уверен, что лучше):
1. Определите мой собственный макрос
#if defined(__LP64__) && __LP64__
#define cgfmax(x,y) fmaxf(x,y)
#else
#define cgfmax(x,y) fmax(x,y)
#endif
Затем я мог бы заменить fmax
на cgfmax
.
2. Используйте tgmath.h
Этот ответ от 2011 года предполагает замену math.h
на tgmath.h
. Это заменяет реализацию fmax
тем, что вызывает __typeof__
для каждого аргумента и возвращает либо fmax
, либо fmaxf
в зависимости от типов аргументов.
3. Игнорировать эту проблему
Поскольку CGFloats относятся к компоновке, потеря данных, потенциально возникшая при хранении float
в double
, обычно будет незначительной. То есть они будут представлять собой небольшие доли пикселей.
Резюме
Я ищу любые другие варианты или полезные советы от того, кто раньше делал переход от 32 до 64 бит.
Ответы
Ответ 1
При преобразовании float
в double
не происходит никаких "потерь данных". Это преобразование всегда точное.
Ваши решения 1 и 2 полностью эквивалентны семантически, хотя (2) более стилистически корректны.
Ваше решение 3 формально не эквивалентно; это может привести к дополнительным преобразованиям между float и double, что может сделать его немного менее эффективным (но фактический результат идентичен).
В принципе, это не имеет значения, но используйте tgmath
.