|
|
@@ -6,11 +6,14 @@
|
|
|
*/
|
|
|
package net.ranides.assira.math;
|
|
|
|
|
|
+import java.lang.reflect.Method;
|
|
|
import java.util.SortedMap;
|
|
|
import java.util.TreeMap;
|
|
|
import net.ranides.assira.annotations.PMD;
|
|
|
import net.ranides.assira.text.StringUtils;
|
|
|
+import net.ranides.assira.time.TimeStack;
|
|
|
import static org.junit.Assert.*;
|
|
|
+import org.junit.Ignore;
|
|
|
import org.junit.Test;
|
|
|
|
|
|
/**
|
|
|
@@ -37,12 +40,12 @@ import org.junit.Test;
|
|
|
|
|
|
int im = parts[0].length();
|
|
|
for(int i=0; i<im; i++) {
|
|
|
- data.put(im-i-1, parts[0].charAt(i)-'0');
|
|
|
+ data.put(im-i-1, PVMath.c2i(parts[0].charAt(i)) );
|
|
|
}
|
|
|
if( parts.length > 1) {
|
|
|
int fm = parts[1].length();
|
|
|
for(int i=0; i<fm; i++) {
|
|
|
- data.put(-i-1, parts[1].charAt(i)-'0');
|
|
|
+ data.put(-i-1, PVMath.c2i(parts[1].charAt(i)));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -121,11 +124,16 @@ import org.junit.Test;
|
|
|
assertEquals("1:1 0:7 -1:9 -2:2 -3:3", digitHash(ri("17.923")) );
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testRem() {
|
|
|
+ System.out.println(rem(ri("567.19"),ri("0.5")));
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
public void testRebase() {
|
|
|
- System.out.println(" rebase = " + irebase(2, ri(0xA4)));
|
|
|
- System.out.println(" rebase = " + irebase(16, ri(0xA4)) );
|
|
|
- System.out.println(" rebase = " + irebase(16, ri(0xC8A4)) );
|
|
|
+// assertEquals("10100100", irebase(2, ri(0xA4)).toString() );
|
|
|
+// assertEquals("A4", irebase(16, ri(0xA4)).toString() );
|
|
|
+// assertEquals("C8A4", irebase(16, ri(0xC8A4)).toString() );
|
|
|
}
|
|
|
|
|
|
private static PVNumber irebase(int base, PVNumber number) {
|
|
|
@@ -142,7 +150,17 @@ import org.junit.Test;
|
|
|
}
|
|
|
|
|
|
private static PVNumber rem(PVNumber n1, PVNumber n2) {
|
|
|
- return new RINumber( String.valueOf(n1.longValue() % n2.longValue()) );
|
|
|
+ long v1 = 0;
|
|
|
+ for(PVNumber.Digit d : n1.digits()) {
|
|
|
+ v1 = v1*n1.base() + d.value();
|
|
|
+ }
|
|
|
+ System.out.println("v1 = " + v1);
|
|
|
+ long v2 = 0;
|
|
|
+ for(PVNumber.Digit d : n2.digits()) {
|
|
|
+ v2 = v2*n2.base() + d.value();
|
|
|
+ }
|
|
|
+ System.out.println("v2 = " + v2);
|
|
|
+ return new RINumber( String.valueOf(v1 % v2) );
|
|
|
}
|
|
|
|
|
|
private static PVNumber div(PVNumber n1, PVNumber n2) {
|
|
|
@@ -172,4 +190,67 @@ import org.junit.Test;
|
|
|
return new RINumber(String.valueOf(value));
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ @Ignore
|
|
|
+ @Test
|
|
|
+ public void testPerf() throws Exception {
|
|
|
+ Method mbi = ICounter.class.getMethod("increment");
|
|
|
+ for(int i=0; i<5; i++) {
|
|
|
+ runPerf(mbi);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void runPerf(Method mbi) throws Exception {
|
|
|
+ Object[] ARGS = new Object[0];
|
|
|
+ int N = 1000000;
|
|
|
+ ICounter a = (ICounter)Class.forName("net.ranides.assira.math.PVNumberTest$TCounter").newInstance();
|
|
|
+ ICounter b = (ICounter)Class.forName("net.ranides.assira.math.PVNumberTest$TCounter").newInstance();
|
|
|
+
|
|
|
+
|
|
|
+ TimeStack t1 = new TimeStack();
|
|
|
+ for(int i=0; i<N; i++) {
|
|
|
+ a.increment();
|
|
|
+ }
|
|
|
+ System.out.printf("%d direct = %4d ms\n", a.result(), t1.stop());
|
|
|
+
|
|
|
+ TimeStack t2 = new TimeStack();
|
|
|
+ for(int i=0; i<N; i++) {
|
|
|
+ mbi.invoke(b, ARGS);
|
|
|
+ }
|
|
|
+ System.out.printf("%d reflect = %4d ms\n", b.result(), t2.stop());
|
|
|
+
|
|
|
+ TimeStack t3 = new TimeStack();
|
|
|
+ int mr = 0;
|
|
|
+ for(int i=0; i<N; i++) {
|
|
|
+ mr += 10 * Math.random();
|
|
|
+ }
|
|
|
+ System.out.printf("%d random = %4d ms\n", mr, t3.stop());
|
|
|
+ }
|
|
|
+
|
|
|
+ private interface ICounter {
|
|
|
+
|
|
|
+ void increment();
|
|
|
+
|
|
|
+ int result();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private static class TCounter implements ICounter {
|
|
|
+ private int mResult;
|
|
|
+
|
|
|
+ public TCounter() {
|
|
|
+ mResult = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void increment() {
|
|
|
+ mResult += 10 * Math.random();
|
|
|
+ }
|
|
|
+
|
|
|
+ public int result() {
|
|
|
+ return mResult;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|