Это скорее комментарий, чем ответ, однако у меня недостаточно репутации, чтобы комментировать в настоящее время.
Я только что столкнулся с неожиданным поведением при использовании CGFLOAT_MAX: на устройстве iPhone 5S (64-битное)под управлением iOS 7.1.2 и с использованием Xcode 5.1.1, следующий код:
CGFloat numRot = floorf(CGFLOAT_MAX / 360.0);
NSLog(@"numRot = %.2f", numRot);
Выходы:
numRot = inf
Принимая во внимание, что этот код:
CGFloat numRot = floorf(FLT_MAX / 360.0);
NSLog(@"numRot = %.2f", numRot);
Правильно выводит:
numRot: 945228740662580166143622731901435904.00
Я команда + щелкнул CGFLOAT_MAX, и Xcode привел меня в файл CGBase.h фреймворков CoreGraphics со следующим определением макроса:
# define CGFLOAT_MAX DBL_MAX
Я команда + щелкнулна CGFloat и Xcode перенесли меня на другую строку в том же файле:
typedef CGFLOAT_TYPE CGFloat;
Затем я нажал + и нажал на CGFLOAT_TYPE, и он перешел к строке #define здесь:
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
...
Итак, по какой-то причине моя переменная CGFloat должна быть двойной, однако она выглядит как float, который переполняется, когда ему присваивается двойное значение (т.е. CGFLOAT_MAX).Насколько я могу сказать, эта страница документации Apple указывает, что использование% f с NSLog должно печатать двойное число - кто-то, пожалуйста, исправьте меня, если это не так.
Все это говорит, если FLT_MAX работаетдля вашего случая вы можете придерживаться этого сейчас вместо CGFLOAT_MAX, особенно если вы полагаетесь на библиотеку, которая специально принимает аргументы с плавающей точкой вместо double или CGFloat.