【发布时间】:2013-01-16 01:08:43
【问题描述】:
我该怎么做?我尝试了 abs() 但它只适用于 int。有内置的方法吗?
CGFloat flo = -123;
abs(flo)
返回 0
【问题讨论】:
-
标准 'abs' 函数在 Swift 4 中效果很好
标签: iphone ios objective-c ipad
我该怎么做?我尝试了 abs() 但它只适用于 int。有内置的方法吗?
CGFloat flo = -123;
abs(flo)
返回 0
【问题讨论】:
标签: iphone ios objective-c ipad
使用 fabs()
CGFloat f = -123.4f;
CGFloat g = fabs(f);
CGFloat 在 64 位机器上定义为 double,在 32 位机器上定义为 float。如果您同时针对 64 位和 32 位,则此答案会变得更复杂,但仍然正确。
您想使用fabs(),因为它适用于大于float 的double 数据类型。在 32 位上,仅当您采用 CGFloat 的绝对值或float。如果您尝试存储大 double 数字的绝对值,您可能会溢出 32 位 CGFloat。简而言之,64 位就可以了,在 32 位上不要混用 double 和 CGFloat 就可以了。
ABS() 宏显然会对某些编译器产生副作用。
【讨论】:
Absolute value function 'fabsf' given an argument of type 'CGFloat' (aka 'double') but has parameter of type 'float' which may cause truncation of value
ABS() 对某些编译器有副作用的最后评论?哪些编译器?如果我坚持使用 Xcode,它是否完全安全?
对于 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);
【讨论】:
小补充:
CGFloat g = fabs(f);
这将导致强制转换警告,因为 fabs() 返回一个双精度值。 要返回浮点值,您需要使用 fabsf()。
CGFloat g = fabsf(f);
【讨论】:
fabs 已折旧。 abs 的签名现在与此签名通用
/// Returns the absolute value of the given number.
///
/// The absolute value of `x` must be representable in the same type. In
/// particular, the absolute value of a signed, fixed-width integer type's
/// minimum cannot be represented.
///
/// let x = Int8.min
/// // x == -128
/// let y = abs(x)
/// // Overflow error
///
/// - Parameter x: A signed number.
/// - Returns: The absolute value of `x`.
@inlinable public func abs<T>(_ x: T) -> T where T : Comparable, T : SignedNumeric
【讨论】: