Подтвердить что ты не робот

Принимая абсолютное значение CGFloat

Как я могу это сделать? Я попробовал abs(), но он работает только для int. Есть ли встроенный способ сделать это?

CGFloat flo = -123;
abs(flo)

это возвращает 0

4b9b3361

Ответ 1

Использовать 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(), очевидно, может иметь побочные эффекты для некоторых компиляторов.

Ответ 2

Для 64/32-разрядной системы

#if CGFLOAT_IS_DOUBLE
    CGFloat g = fabs(flo);
#else
    CGFloat g = fabsf(flo);
#endif

Ответ 3

Обычно я использую макрос АБС, насколько я могу судить, он работает независимо от того, в какой системе вы находитесь или какой примитив вы используете.

CGFloat x = -1.1;
double y = -2.1;
NSInteger z = -5;

x = ABS(x);
y = ABS(y);
z = ABS(z);

Ответ 4

Небольшое дополнение:

CGFloat g = fabs(f);

Это приведет к предупреждению о литье, потому что fabs() возвращает двойное значение. Чтобы получить возвращаемое значение float, вам нужно использовать fabsf().

CGFloat g = fabsf(f);