Математические функции на основе CGFloat?

В OS X и iOS Apple использует CGFloat typedef для автоматического получения 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 и более ужасным кодом IMHO.

Или вы могли бы использовать CGFloat вместе с double -версиями и просто использовать пространство и производительность, позволяя компилятору конвертировать между double и float все время. И не заботятся о возможных предупреждениях "Неявное преобразование в 32-битный тип".

Или, может быть, лучшая стратегия, ставка на 64-битную версию iOS когда-либо появится (или, по крайней мере, в ближайшем будущем) и используйте CGFloat вместе с float -версиями математических функций Unix, а не беспокоясь о будущем.

Какую стратегию вы используете?

Ответ 1

Edit: Итак, этот вопрос уже не является теоретическим, потому что у нас 64-битная iOS!

Я думаю, что самый простой способ справиться с этим - использовать tgmath.h вместо math.h (math.h автоматически импортируется с помощью Cocoa, tgmath не так, вам нужно объявить его где-нибудь).

В разделе Cocoa список рассылки обсуждается ряд потенциальных решений: http://www.cocoabuilder.com/archive/cocoa/291802-math-functions-with-cgfloat.html

Я согласен с большинством людей в этом списке, что tgmath - это, вероятно, путь. Я полагаю, что изначально он был предназначен для упрощения переноса кода Fortran, но он также работает в этом сценарии. TGMath позволит вам:

double floor(double x);
float floor(float x);
long double floor(long double x);

Ответ 2

Если использовать точность, требуемую приложением (которая уже может быть ниже пределов человеческого восприятия), и может получить подходящую числовую точность, если предположить, что CGFloats - это не более чем одиночные прецизионные поплавки, тогда любые будущие обновления API до двух не будет покупать этот существующий код в любом виде (видимом, слышимом) улучшении.