Iphone 取CGFloat的绝对值
我该怎么做?我试过abs(),但它只对int有效。是否有一种内置的方法来实现这一点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)的返
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);