- Notifications
You must be signed in to change notification settings - Fork 18
Examples
Marco Terzer edited this page Jun 14, 2017 · 27 revisions
- Example 1: Interest Calculation
- Example 2: Circumference of a Circle
- Example 3: Mean and Standard Deviation with
MutableDecimal - Example 4: Addition
- Example 5: Multiplication
- Example 6: Square Root of Two
- Example 7: Gauss–Legendre to Calculate Digits of PI
- Example 8: Zero Garbage with DecimalArithmetic API
public class Interest { public static void main(String[] args) { Decimal2f principal = Decimal2f.valueOf(9500); Decimal3f rate = Decimal3f.valueOf(0.067); Decimal2f time = Decimal2f.valueOf(1).divide(4); Decimal2f interest = principal.multiplyBy(rate.multiplyExact(time)); System.out.println("First quarter interest: $" + interest); } }will output
First quarter interest: $159.13 public class Circle { public static void main(String[] args) { Decimal18f PI = Decimal18f.valueOf(Math.PI); Decimal2f radius = Decimal2f.valueOf(5); Decimal2f circ = radius.multiplyBy(PI.multiply(2)); System.out.println("Circumference with 5m radius is ~" + circ + "m"); System.out.println("Circumference with 5m radius is ~" + (2*Math.PI * 5) + "m"); Decimal2f down = radius.multiplyBy(PI.multiply(2), RoundingMode.DOWN); System.out.println("Circumference with 5m radius is larger than " + down + "m"); } }will output
Circumference with 5m radius is ~31.42m Circumference with 5m radius is ~31.41592653589793m Circumference with 5m radius is larger than 31.41m public class MeanStdDev { /* Random generator*/ private static final Random RND = new Random(); /* Sample count*/ private static final int N = 10000; /* Expected sample mean*/ private static final Decimal10f EXP_MEAN = Decimal10f.valueOf(0); public static void main(String[] args) { MutableDecimal10f mean = new MutableDecimal10f(); MutableDecimal10f var = new MutableDecimal10f(); for (int i = 0; i < N; i++) { double value = RND.nextGaussian(); mean.add(value); var.addSquared(EXP_MEAN.subtract(value)); } System.out.println("Mean: " + mean.divide(N)); System.out.println("Variance: " + var.divide(N)); System.out.println("StdDev: " + var.sqrt()); } }will output something like
Mean: 0.0111499553 Variance: 1.0109666338 StdDev: 1.0054683654 public class Add { public static void main(String[] args) { Decimal2f a = Decimal2f.valueOf(4); Decimal2f b = Decimal2f.valueOf(1.5); Decimal3f c = Decimal3f.valueOf(0.125); Decimal3f d = Decimal3f.valueOf(0.5); System.out.println("ADD: values with same scale"); Decimal2f sumAB = a.add(b); Decimal3f sumCD = c.add(d); System.out.println("a+b = " + sumAB); System.out.println("c+d = " + sumCD); System.out.println("ADD: values with different scales"); Decimal2f sumAC = a.add(c, RoundingMode.HALF_UP); Decimal3f sumCA = c.add(a, RoundingMode.UNNECESSARY); System.out.println("a+c = " + sumAC); System.out.println("c+a = " + sumCA); } }will output
ADD: values with same scale a+b = 5.50 c+d = 0.625 ADD: values with different scales a+c = 4.13 c+a = 4.125 public class Multiply { public static void main(String[] args) { Decimal2f a = Decimal2f.valueOf(4); Decimal2f b = Decimal2f.valueOf(1.5); Decimal3f c = Decimal3f.valueOf(0.125); Decimal3f d = Decimal3f.valueOf(0.5); System.out.println("MULTIPLY: values with same scale"); Decimal2f productAB = a.multiply(b); Decimal3f productCD = c.multiply(d); Decimal3f downCD = c.multiply(d, RoundingMode.DOWN); System.out.println("a*b = " + productAB); System.out.println("c*d = " + productCD); System.out.println("c*d = " + downCD); System.out.println("MULTIPLY: values with different scales"); Decimal2f productAC = a.multiplyBy(c); Decimal2f productBC = b.multiplyBy(c); Decimal2f productBD = b.multiplyBy(d); Decimal3f productCA = c.multiplyBy(a); System.out.println("a*c = " + productAC); System.out.println("b*c = " + productBC); System.out.println("b*d = " + productBD); System.out.println("c*a = " + productCA); System.out.println("MULTIPLY: exact multiplication"); Decimal<?> exactCD = c.multiplyExact(d); Decimal6f typedCD = c.multiplyExact().by(d); Decimal5f typedAD = a.multiplyExact().by(d); System.out.println("c*d = " + exactCD); System.out.println("c*d = " + typedCD); System.out.println("a*d = " + typedAD); } }will output
MULTIPLY: values with same scale a*b = 6.00 c*d = 0.063 c*d = 0.062 MULTIPLY: values with different scales a*c = 0.50 b*c = 0.19 b*d = 0.75 c*a = 0.500 MULTIPLY: exact multiplication c*d = 0.062500 c*d = 0.062500 a*d = 2.00000 public class Sqrt { public static void main(String[] args) { System.out.println("sqrt(2)=" + Decimal18f.TWO.sqrt()); System.out.println("sqrt(2)=" + Math.sqrt(2)); } }will output
sqrt(2)=1.414213562373095049 sqrt(2)=1.4142135623730951 public class Pi { public static void main(String[] args) { Decimal17f a = Decimal17f.ONE; Decimal17f b = Decimal17f.TWO.sqrt().shiftRight(1);//1/sqrt(2) == sqrt(2)/2 Decimal17f t = Decimal17f.ONE.divide(4); Decimal17f p = Decimal17f.ONE; for (int i = 0; i < 3; i++) { System.out.println("step " + (i+1) + ": " + pi(a, b, t, p)); Decimal17f an = a.avg(b); Decimal17f bn = a.multiply(b).sqrt(); Decimal17f tn = t.subtract(p.multiply(a.subtract(an).square())); Decimal17f pn = p.shiftLeft(1); a = an; b = bn; t = tn; p = pn; } System.out.println("RESULT: " + pi(a, b, t, p)); System.out.println("DOUBLE: " + Math.PI); } private static Decimal<?> pi(Decimal17f a, Decimal17f b, Decimal17f t, Decimal17f p) { return a.add(b).square().divide(t).shiftRight(2); } }will output
step 1: 2.91421356237309503 step 2: 3.14057925052216826 step 3: 3.14159264621354222 RESULT: 3.14159265358979315 DOUBLE: 3.141592653589793