Математические функции на основе CGFloat?
Как в OS X, так и в iOS Apple использует typedef CGFloat для автоматического получения float
на 32-битных системах и double
на 64-битных системах. Но при использовании обычных математических функций Unix вы должны принимать это решение в каждом конкретном случае.
Например, floor()
функция определяется как:
double floor(double x);
и floorf()
Функция определяется как:
float floorf(float x);
Я знаю, что все устройства iOS сегодня32-разрядные, но причина использования CGFloat заключается в том, чтобы автоматически получать улучшенную точность при появлении первых 64-разрядных устройств iOS (iPad 5?) И не нужно менять код. Но чтобы сделать это возможным, нам нужны математические функции на основе CGFloat:
CGFloat Floor(CGFloat x);
Есть ли такие функции в iOS или сторонних библиотеках? Или как другие разработчики справляются с этим? Я подозреваю, что большинство либо используют CGFloat
вместе с float
-версии на iOS, но тогда вам "нужно" изменить каждую строку с помощью математической функции при компиляции для 64-битного устройства iOS (и обрабатывать две разные версии вашей кодовой базы).
Или вы могли бы просто использовать float
вместо CGFloat
везде и не беспокоиться о 64-битной iOS. Но тогда вы получите несоответствие с библиотеками Apple и ИМХО более уродливым кодом.
Или вы могли бы использовать CGFloat
вместе с double
-versions и просто берут пространство и производительность, позволяя компилятору все время конвертировать между double и float. И не заботиться о возможных предупреждениях "Неявное преобразование в 32-битный тип".
Или, может быть, лучшая стратегия, ставка на 64-битную версию iOS никогда не появится (или, по крайней мере, в ближайшем будущем) и будет использоваться CGFloat
вместе с float
-версии математических функций Unix и не беспокоиться о будущем.
Какую стратегию вы используете?
1 ответ
Изменить: Таким образом, этот вопрос больше не является теоретическим теперь, когда у нас есть 64-битная iOS!
Я думаю, что самый простой способ справиться с этим, это использовать tgmath.h
, вместо math.h
(math.h автоматически импортируется Cocoa, а tgmath - нет, поэтому вам нужно где-то объявить его).
Существует ряд потенциальных решений, обсуждаемых в ветке списка рассылки Cocoa: http://www.cocoabuilder.com/archive/cocoa/291802-math-functions-with-cgfloat.html
Я согласен с большинством людей в этом списке, что tgmath - это, вероятно, верный путь. Я считаю, что изначально он был предназначен для легкого портирования кода на Фортране, но он также работает в этом сценарии TGMath позволит вам сделать:
double floor(double x);
float floor(float x);
long double floor(long double x);
Если кто-то использует точность, требуемую приложением (которая может быть уже ниже пределов разрешения восприятия человеком), и может получить подходящую числовую точность, предполагая, что значения CGFloats не более чем плавающие с одинарной точностью, то любые будущие обновления API до двойного не будут купите этот существующий код любым необходимым (видимым, слышимым) улучшением.