package eas.math.matrix.bigDecimal.jama;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import eas.math.matrix.bigDecimal.MatrixBigDecimal;
public class Maths implements Serializable {
private static final long serialVersionUID = -9098270767955609067L;
/** sqrt(a^2 + b^2) without under/overflow. **/
public static BigDecimal hypot(BigDecimal a, BigDecimal b, int roundingMode) {
BigDecimal r;
if (a.abs().compareTo(b.abs()) > 0) {
int scale = MatrixBigDecimal.GLOBAL_SCALE;
r = b.divide(a, scale);
r = a.abs().multiply(sqrt(r.multiply(r, new MathContext(scale)).add(BigDecimal.ONE), scale, roundingMode), new MathContext(scale));
} else if (b.compareTo(BigDecimal.ZERO) != 0) {
int scale = MatrixBigDecimal.GLOBAL_SCALE;
r = a.divide(b, scale);
r = b.abs().multiply(sqrt(r.multiply(r, new MathContext(scale)).add(BigDecimal.ONE), scale, roundingMode), new MathContext(scale));
} else {
r = BigDecimal.ZERO;
}
return r;
}
public static final BigDecimal TWO = new BigDecimal("2");
public static BigDecimal sqrt(BigDecimal a, final int scale, final int roundingMode) {
BigDecimal x0 = new BigDecimal("0");
BigDecimal x1 = new BigDecimal(Math.sqrt(a.doubleValue()));
while (!x0.equals(x1)) {
x0 = x1;
x1 = a.divide(x0, scale, roundingMode);
x1 = x1.add(x0);
x1 = x1.divide(TWO, scale, roundingMode);
}
return x1;
}
public static void printMatrix(JamaMatrixBigDecimal mat) {
for (int i = 0; i < mat.getColumnDimension(); i++) {
for (int j = 0; j < mat.getRowDimension(); j++) {
System.out.print(" | " + mat.get(j, i));
}
System.out.println();
}
}
public static void setScale(JamaMatrixBigDecimal mat) {
for (int i = 0; i < mat.getColumnDimension(); i++) {
for (int j = 0; j < mat.getRowDimension(); j++) {
mat.get(j, i).setScale(100);
}
}
}
}