37

どうやってやるの?abs()を試しましたが、intに対してのみ機能します。そうするための組み込みの方法はありますか?

CGFloat flo = -123;
abs(flo)

これは0を返します

4

5 に答える 5

75

fabs()を使用する

CGFloat f = -123.4f;
CGFloat g = fabs(f);

CGFloatdoubleは、64ビットマシンおよび32ビットマシンで定義されfloatます。64ビットと32ビットの両方をターゲットにしている場合、この回答はより複雑になりますが、それでも正しいです。

より大きいデータ型でfabs()機能するため、使用する必要があります。32ビットでは、(である)の戻り値を(である)に割り当てることは、aまたは。の絶対値を取得している場合にのみ問題ありません。大きな数値の絶対値を格納しようとすると、32ビットがオーバーフローする可能性があります。要するに、64ビットは問題ありません。32ビットでは、混同しないでください。問題はありません。doublefloatfabs()doubleCGFloatfloatCGFloatfloatCGFloatdoubledoubleCGFloat

マクロはABS()、一部のコンパイラに副作用をもたらす可能性があるようです。

于 2013-01-16T01:12:16.557 に答える
9

64/32ビットシステムの場合

#if CGFLOAT_IS_DOUBLE
    CGFloat g = fabs(flo);
#else
    CGFloat g = fabsf(flo);
#endif
于 2014-12-09T03:55:47.707 に答える
8

私は通常、ABSマクロを使用していますが、私が知る限り、使用しているシステムや使用しているプリミティブに関係なく機能します。

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

x = ABS(x);
y = ABS(y);
z = ABS(z);
于 2015-04-10T04:50:14.313 に答える
6

小さな追加:

CGFloat g = fabs(f);

fabs()はdouble値を返すため、これによりキャスト警告が発生します。float値を取り戻すには、fabsf()を使用する必要があります。

CGFloat g = fabsf(f);
于 2014-01-09T11:36:58.820 に答える
0

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
于 2020-08-18T18:55:46.307 に答える