Замена на `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
,