どうやってやるの?abs()を試しましたが、intに対してのみ機能します。そうするための組み込みの方法はありますか?
CGFloat flo = -123;
abs(flo)
これは0を返します
どうやってやるの?abs()を試しましたが、intに対してのみ機能します。そうするための組み込みの方法はありますか?
CGFloat flo = -123;
abs(flo)
これは0を返します
fabs()を使用する
CGFloat f = -123.4f;
CGFloat g = fabs(f);
CGFloat
double
は、64ビットマシンおよび32ビットマシンで定義されfloat
ます。64ビットと32ビットの両方をターゲットにしている場合、この回答はより複雑になりますが、それでも正しいです。
より大きいデータ型でfabs()
機能するため、使用する必要があります。32ビットでは、(である)の戻り値を(である)に割り当てることは、aまたは。の絶対値を取得している場合にのみ問題ありません。大きな数値の絶対値を格納しようとすると、32ビットがオーバーフローする可能性があります。要するに、64ビットは問題ありません。32ビットでは、混同しないでください。問題はありません。double
float
fabs()
double
CGFloat
float
CGFloat
float
CGFloat
double
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()はdouble値を返すため、これによりキャスト警告が発生します。float値を取り戻すには、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