[英]taking absolute value of CGFloat
我怎樣才能做到這一點? 我試過 abs() 但它只適用於 int 的。 有沒有內置的方法來做到這一點?
CGFloat flo = -123;
abs(flo)
這將返回 0
使用 fabs()
CGFloat f = -123.4f;
CGFloat g = fabs(f);
CGFloat
在 64 位機器上被定義為double
float
在 32 位機器上被定義為float
。 如果您同時針對 64 位和 32 位,則此答案會變得更加復雜,但仍然是正確的。
您想使用fabs()
因為它適用於大於float
double
數據類型。 在 32 位上,僅當您采用CGFloat
或float
的絕對值時,才可以將fabs()
(這是一個double
)的返回值分配給一個CGFloat
(這是一個float
)。 如果您嘗試存儲大double
數的絕對值,您可能會溢出 32 位CGFloat
。 簡而言之,64 位很好,在 32 位上不要混合和匹配double
和CGFloat
,你會沒事的。
ABS()
宏顯然會對某些編譯器產生副作用。
對於 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.