Как я могу это сделать? Я попробовал abs(), но он работает только для int. Есть ли встроенный способ сделать это?
CGFloat flo = -123;
abs(flo)
это возвращает 0
Как я могу это сделать? Я попробовал abs(), но он работает только для int. Есть ли встроенный способ сделать это?
CGFloat flo = -123;
abs(flo)
это возвращает 0
Использовать fabs()
CGFloat f = -123.4f;
CGFloat g = fabs(f);
CGFloat
определяется как double
на 64-битных машинах и float
на 32-битных машинах. Если вы ориентируетесь как на 64, так и на 32 бит, этот ответ становится более сложным, но по-прежнему верен.
Вы хотите использовать fabs()
, потому что он работает с double
datatypes, которые больше, чем float
. В 32-битном назначении возвращаемого значения fabs()
(который является double
) в CGFloat
(который является float
) ТОЛЬКО ОК, если вы принимаете абсолютное значение a CGFloat
или float
. Вы можете переполнить 32-разрядный CGFloat
, если попытаетесь сохранить абсолютное значение большого номера double
. Короче говоря, 64-битная версия прекрасна, а на 32-битных не смешиваются и не соответствуют double
и CGFloat
, и все будет в порядке.
Макрос ABS()
, очевидно, может иметь побочные эффекты для некоторых компиляторов.
Для 64/32-разрядной системы
#if CGFLOAT_IS_DOUBLE
CGFloat g = fabs(flo);
#else
CGFloat g = fabsf(flo);
#endif
Обычно я использую макрос АБС, насколько я могу судить, он работает независимо от того, в какой системе вы находитесь или какой примитив вы используете.
CGFloat x = -1.1;
double y = -2.1;
NSInteger z = -5;
x = ABS(x);
y = ABS(y);
z = ABS(z);
Небольшое дополнение:
CGFloat g = fabs(f);
Это приведет к предупреждению о литье, потому что fabs() возвращает двойное значение. Чтобы получить возвращаемое значение float, вам нужно использовать fabsf().
CGFloat g = fabsf(f);