package st.gravel.support.jvm; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; public class FloatExtensions { public static double asDouble(float receiver) { return receiver; } public static Number ceiling(float receiver) { return roundToRoundingMode(receiver, RoundingMode.FLOOR); } public static double differenceFromDouble_(float receiver, double argument) { return argument - receiver; } public static float differenceFromFloat_(float receiver, float argument) { return argument - receiver; } public static float differenceFromLargeInteger_(float receiver, BigInteger argument) { return argument.floatValue() - receiver; } public static float differenceFromSmallInteger_(float receiver, int argument) { return argument - receiver; } public static int emax() { return Float.MAX_EXPONENT; } public static int emin() { return Float.MIN_EXPONENT; } public static float epsilon() { return Math.ulp(1.0f); } public static Number floor(float receiver) { return roundToRoundingMode(receiver, RoundingMode.FLOOR); } public static float fmax() { return Float.MAX_VALUE; } public static float fminDenormalized() { return Float.MIN_VALUE; } public static float fminNormalized() { return Float.MIN_NORMAL; } public static boolean lessFromDouble_(float receiver, double argument) { return argument < receiver; } public static boolean lessFromFloat_(float receiver, float argument) { return argument < receiver; } public static boolean lessFromLargeInteger_(float receiver, BigInteger argument) { return new BigDecimal(argument).compareTo(BigDecimal.valueOf(receiver)) == -1; } public static boolean lessFromSmallInteger_(float receiver, int argument) { return argument < receiver; } public static float ln(float receiver) { return (float)Math.log(receiver); } public static float naN() { return Float.NaN; } public static float negativeInfinity() { return Float.NEGATIVE_INFINITY; } public static float positiveInfinity() { return Float.POSITIVE_INFINITY; } public static int precision() { return 32; } public static String printBase_(float receiver, int radix) { if (radix == 10) return Float.toString(receiver); throw new UnsupportedOperationException("Unsupported radix: " + radix); } public static double productFromDouble_(float receiver, double argument) { return argument * receiver; } public static float productFromFloat_(float receiver, float argument) { return argument * receiver; } public static float productFromLargeInteger_(float receiver, BigInteger argument) { return argument.floatValue() * receiver; } public static float productFromSmallInteger_(float receiver, int argument) { return argument * receiver; } public static double quotientFromDouble_(float receiver, double argument) { return argument / receiver; } public static float quotientFromFloat_(float receiver, float argument) { return argument / receiver; } public static float quotientFromLargeInteger_(float receiver, BigInteger argument) { return argument.floatValue() / receiver; } public static float quotientFromSmallInteger_(float receiver, int argument) { return argument / receiver; } public static Number rounded(float receiver) { return roundToRoundingMode(receiver, RoundingMode.HALF_UP); } private static Number roundToRoundingMode(float receiver, RoundingMode roundingMode) { BigDecimal bigDecimal = new BigDecimal(receiver); BigDecimal rounded = bigDecimal.setScale(0, roundingMode); return IntegerExtensions.objectFromBigInteger(rounded.toBigInteger()); } public static int exponent(float receiver) { return StrictMath.getExponent(receiver); } public static float sqrt(float receiver) { return (float) Math.sqrt(receiver); } public static double sumFromDouble_(float receiver, double argument) { return argument + receiver; } public static float sumFromFloat_(float receiver, float argument) { return argument + receiver; } public static float sumFromLargeInteger_(float receiver, BigInteger argument) { return argument.floatValue() + receiver; } public static float sumFromSmallInteger_(float receiver, int argument) { return argument + receiver; } public static Number truncated(float receiver) { return roundToRoundingMode(receiver, RoundingMode.DOWN); } }