Подтвердить что ты не робот

Замена для `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 бит.

4b9b3361

Ответ 1

При преобразовании float в double не происходит никаких "потерь данных". Это преобразование всегда точное.

Ваши решения 1 и 2 полностью эквивалентны семантически, хотя (2) более стилистически корректны.

Ваше решение 3 формально не эквивалентно; это может привести к дополнительным преобразованиям между float и double, что может сделать его немного менее эффективным (но фактический результат идентичен).

В принципе, это не имеет значения, но используйте tgmath.