Математические функции на основе 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 до двойного не будут купите этот существующий код любым необходимым (видимым, слышимым) улучшением.

Другие вопросы по тегам