mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
classlib: add Math cell/floor div/mod versions, add exact versions of methods
This commit is contained in:
parent
4546029a5a
commit
f85aa977eb
|
@ -143,6 +143,13 @@ public final class TMath extends TObject {
|
||||||
return (a ^ b) < 0 && div * b != a ? div - 1 : div;
|
return (a ^ b) < 0 && div * b != a ? div - 1 : div;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int floorDivExact(int a, int b) {
|
||||||
|
if (a == Integer.MIN_VALUE && b == -1) {
|
||||||
|
throw new ArithmeticException();
|
||||||
|
}
|
||||||
|
return floorDiv(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
public static long floorDiv(long a, int b) {
|
public static long floorDiv(long a, int b) {
|
||||||
return floorDiv(a, (long) b);
|
return floorDiv(a, (long) b);
|
||||||
}
|
}
|
||||||
|
@ -152,16 +159,67 @@ public final class TMath extends TObject {
|
||||||
return (a ^ b) < 0 && div * b != a ? div - 1 : div;
|
return (a ^ b) < 0 && div * b != a ? div - 1 : div;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long floorDivExact(long a, long b) {
|
||||||
|
if (a == Long.MIN_VALUE && b == -1) {
|
||||||
|
throw new ArithmeticException();
|
||||||
|
}
|
||||||
|
return floorDiv(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int ceilDiv(int a, int b) {
|
||||||
|
int div = a / b;
|
||||||
|
return (a ^ b) >= 0 && div * b != a ? div + 1 : div;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int ceilDivExact(int a, int b) {
|
||||||
|
if (a == Integer.MIN_VALUE && b == -1) {
|
||||||
|
throw new ArithmeticException();
|
||||||
|
}
|
||||||
|
return ceilDiv(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long ceilDiv(long a, int b) {
|
||||||
|
return ceilDiv(a, (long) b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long ceilDiv(long a, long b) {
|
||||||
|
long div = a / b;
|
||||||
|
return (a ^ b) >= 0 && div * b != a ? div + 1 : div;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long ceilDivExact(long a, long b) {
|
||||||
|
if (a == Long.MIN_VALUE && b == -1) {
|
||||||
|
throw new ArithmeticException();
|
||||||
|
}
|
||||||
|
return ceilDiv(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
public static int floorMod(int a, int b) {
|
public static int floorMod(int a, int b) {
|
||||||
return a - floorDiv(a, b) * b;
|
int mod = a % b;
|
||||||
|
return (a ^ b) < 0 && mod != 0 ? mod + b : mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int floorMod(long a, int b) {
|
public static int floorMod(long a, int b) {
|
||||||
return (int) (a - floorDiv(a, b) * b);
|
return (int) floorMod(a, (long) b);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long floorMod(long a, long b) {
|
public static long floorMod(long a, long b) {
|
||||||
return a - floorDiv(a, b) * b;
|
long mod = a % b;
|
||||||
|
return (a ^ b) < 0 && mod != 0 ? mod + b : mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int ceilMod(int a, int b) {
|
||||||
|
int mod = a % b;
|
||||||
|
return (a ^ b) >= 0 && mod != 0 ? mod - b : mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int ceilMod(long a, int b) {
|
||||||
|
return (int) ceilMod(a, (long) b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long ceilMod(long a, long b) {
|
||||||
|
long mod = a % b;
|
||||||
|
return (a ^ b) >= 0 && mod != 0 ? mod - b : mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int incrementExact(int a) {
|
public static int incrementExact(int a) {
|
||||||
|
@ -419,10 +477,26 @@ public final class TMath extends TObject {
|
||||||
return n >= 0 ? n : -n;
|
return n >= 0 ? n : -n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int absExact(int n) {
|
||||||
|
if (n == Integer.MIN_VALUE) {
|
||||||
|
throw new ArithmeticException();
|
||||||
|
} else {
|
||||||
|
return abs(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static long abs(long n) {
|
public static long abs(long n) {
|
||||||
return n >= 0 ? n : -n;
|
return n >= 0 ? n : -n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long absExact(long n) {
|
||||||
|
if (n == Long.MIN_VALUE) {
|
||||||
|
throw new ArithmeticException();
|
||||||
|
} else {
|
||||||
|
return abs(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@GeneratedBy(MathNativeGenerator.class)
|
@GeneratedBy(MathNativeGenerator.class)
|
||||||
@NoSideEffects
|
@NoSideEffects
|
||||||
private static native float absImpl(float d);
|
private static native float absImpl(float d);
|
||||||
|
|
|
@ -291,4 +291,24 @@ public class MathTest {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ceilFloorModDiv() {
|
||||||
|
assertEquals(-2, Math.ceilMod(+4, +3));
|
||||||
|
assertEquals(+2, Math.ceilMod(-4, -3));
|
||||||
|
assertEquals(+1, Math.ceilMod(+4, -3));
|
||||||
|
assertEquals(-1, Math.ceilMod(-4, +3));
|
||||||
|
assertEquals(+1, Math.floorMod(+4, +3));
|
||||||
|
assertEquals(-1, Math.floorMod(-4, -3));
|
||||||
|
assertEquals(-2, Math.floorMod(+4, -3));
|
||||||
|
assertEquals(+2, Math.floorMod(-4, +3));
|
||||||
|
assertEquals(+2, Math.ceilDiv(5, 3));
|
||||||
|
assertEquals(+2, Math.ceilDiv(6, 3));
|
||||||
|
assertEquals(-1, Math.ceilDiv(-5, 3));
|
||||||
|
assertEquals(-2, Math.ceilDiv(-6, 3));
|
||||||
|
assertEquals(+1, Math.floorDiv(5, 3));
|
||||||
|
assertEquals(+2, Math.floorDiv(6, 3));
|
||||||
|
assertEquals(-2, Math.floorDiv(-5, 3));
|
||||||
|
assertEquals(-2, Math.floorDiv(-6, 3));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user