簡體   English   中英

取 CGFloat 的絕對值

[英]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 位上,僅當您采用CGFloatfloat的絕對值時,才可以將fabs() (這是一個double )的返回值分配給一個CGFloat (這是一個float )。 如果您嘗試存儲大double數的絕對值,您可能會溢出 32 位CGFloat 簡而言之,64 位很好,在 32 位上不要混合和匹配doubleCGFloat ,你會沒事的。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM