単に使用しない理由:
int sign = (int) Math.signum(a); //1 cast for floating-points, 2 for Integer types
さらに、ほとんどのNumber実装には、その型のプリミティブを取り、intを返すsignumメソッドがあるため、パフォーマンスを向上させるためにキャストを回避できます。
int sign1 = Integer.signum(12); //no casting
int sign2 = Long.signum(-24l); //no casting
+1 / 0 / -1を返し、優れたパフォーマンスを提供するように最適化されています。
参考までに、openJDKの実装をご覧ください。関連するビットは次のとおりです。
public static float signum(float f) {
return (f == 0.0f || isNaN(f)) ? f : copySign(1.0f, f);
}
public static boolean isNaN(float f) {
return (f != f);
}
public static float copySign(float magnitude, float sign) {
return rawCopySign(magnitude, (isNaN(sign) ? 1.0f : sign));
}
public static float rawCopySign(float magnitude, float sign) {
return Float.intBitsToFloat((Float.floatToRawIntBits(sign)
& (FloatConsts.SIGN_BIT_MASK))
| (Float.floatToRawIntBits(magnitude)
& (FloatConsts.EXP_BIT_MASK
| FloatConsts.SIGNIF_BIT_MASK)));
}
static class FloatConsts {
public static final int SIGN_BIT_MASK = -2147483648;
public static final int EXP_BIT_MASK = 2139095040;
public static final int SIGNIF_BIT_MASK = 8388607;
}