Iphone 取CGFloat的绝对值

Iphone 取CGFloat的绝对值,iphone,ios,objective-c,ipad,Iphone,Ios,Objective C,Ipad,我该怎么做?我试过abs(),但它只对int有效。是否有一种内置的方法来实现这一点 CGFloat flo = -123; abs(flo) 这将返回0使用fabs() CGFloat在64位机器上定义为double,在32位机器上定义为float。如果您同时针对64位和32位,那么这个答案会变得更复杂,但仍然是正确的 您希望使用fabs(),因为它适用于大于float的double数据类型。在32位上,仅当您采用CGFloat或float的绝对值时,才可以将fabs()(是double)的返

我该怎么做?我试过abs(),但它只对int有效。是否有一种内置的方法来实现这一点

CGFloat flo = -123;
abs(flo)
这将返回0使用fabs()

CGFloat
在64位机器上定义为
double
,在32位机器上定义为
float
。如果您同时针对64位和32位,那么这个答案会变得更复杂,但仍然是正确的

您希望使用
fabs()
,因为它适用于大于
float
double
数据类型。在32位上,仅当您采用
CGFloat
float
的绝对值时,才可以将
fabs()
(是
double
)的返回值分配到
CGFloat
(是
float
)中。如果试图存储一个大的
双精度
数字的绝对值,则可能会导致32位
CGFloat
溢出。简言之,64位就可以了,在32位上,不要混合匹配
double
CGFloat
,你就可以了

ABS()
宏显然会对某些编译器产生副作用。

小增加:

CGFloat g = fabs(f);
这将导致强制转换警告,因为fabs()返回一个双精度值。 要返回浮点值,需要使用fabsf()

适用于64/32位系统

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

我通常只使用ABS宏,据我所知,无论您使用的是哪个系统或是哪个原语,它都可以工作

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

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

fabs
折旧。
abs
的签名现在与此签名通用

///返回给定数字的绝对值。
///
///`x`的绝对值必须在同一类型中表示。在里面
///特别是有符号、固定宽度整数类型的绝对值
///无法表示最小值。
///
///设x=Int8.min
/////x==-128
///设y=abs(x)
/////溢出错误
///
///-参数x:有符号的数字。
///-返回:x的绝对值。
@可内联公共函数abs(x:T)->T其中T:compariable,T:SignedNumeric

正确(+1),但打印值或进行赋值。CGFloat是float或double(32/64位系统)的typedef。fabs需要一个双精度(至少在我的xcode中,这是它想要的)。那么这是安全的吗?因为CGFloat可以定义为double或float,很难说这是正确的答案:fabsf期望一个float作为输入参数,fabs总是返回double。建议在32位/64位环境(如今天的手机)中使用std::abs()或宏abs()。这在64位iOS中不再正确,您会收到一个语义问题警告:
绝对值函数'fabsf'给定了'CGFloat'类型的参数(也称为'double')但是具有可能导致值截断的“float”类型的参数
您是否可以详细介绍您最后一次关于
ABS()
对某些编译器有副作用的评论?哪些编译器?如果我坚持使用Xcode,它是完全安全的吗?除了制作自己的宏包装器之外,这是最好的答案。除此之外,请确定您是否真的需要担心任何32位平台。正如Skela在另一个回答中所说,这正是预定义宏ABS的用途。标准“ABS”功能在Swift 4中非常有效
#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);