package jetbrains.mps.baseLanguage.math.runtime;
/*Generated by MPS */
import java.math.BigDecimal;
import java.math.MathContext;
public class BigComplex extends Number {
private BigDecimal myRealPart;
private BigDecimal myImagPart;
public BigComplex(Complex c) {
myRealPart = BigDecimal.valueOf(c.re());
myImagPart = BigDecimal.valueOf(c.im());
}
public BigComplex(BigDecimal bd1, BigDecimal bd2) {
myRealPart = bd1;
myImagPart = bd2;
}
public BigComplex(double d1, double d2) {
myRealPart = BigDecimal.valueOf(d1);
myImagPart = BigDecimal.valueOf(d2);
}
@Override
public boolean equals(Object obj) {
if ((obj == null) || !((obj instanceof BigComplex))) {
return false;
}
BigComplex Cobj = (BigComplex) obj;
return (Cobj.myRealPart.compareTo(myRealPart) == 0) && (Cobj.myImagPart.compareTo(myImagPart) == 0);
}
@Override
public String toString() {
if (myImagPart.signum() == 0) {
return "" + myRealPart;
}
if (myRealPart.signum() == 0) {
return myImagPart + "*I";
}
return "(" + myRealPart + ((myImagPart.signum() > 0 ? "+" : "-")) + myImagPart.abs() + "*I)";
}
public BigDecimal re() {
return myRealPart;
}
public BigDecimal im() {
return myImagPart;
}
public BigDecimal abs(MathContext mc) {
return MathRuntime.sqrt(re().pow(2).add(im().pow(2)), mc);
}
public BigComplex add(BigComplex b) {
return new BigComplex(myRealPart.add(b.myRealPart), myImagPart.add(b.myImagPart));
}
public BigComplex sub(BigComplex b) {
return new BigComplex(myRealPart.subtract(b.myRealPart), myImagPart.subtract(b.myImagPart));
}
public BigComplex mul(BigComplex b) {
return new BigComplex(myRealPart.multiply(b.myRealPart).subtract(myImagPart.multiply(b.myImagPart)), myRealPart.multiply(b.myImagPart).add(b.myRealPart.multiply(myImagPart)));
}
public BigComplex inv() {
BigDecimal s = myRealPart.multiply(myRealPart).add(myImagPart.multiply(myImagPart));
return new BigComplex(myRealPart.divide(s), myImagPart.divide(s).negate());
}
public BigComplex div(BigComplex b) {
return mul(b.inv());
}
public BigComplex conj() {
return new BigComplex(myRealPart, myImagPart.negate());
}
public BigComplex add(BigComplex b, MathContext mc) {
return new BigComplex(myRealPart.add(b.myRealPart, mc), myImagPart.add(b.myImagPart, mc));
}
public BigComplex sub(BigComplex b, MathContext mc) {
return new BigComplex(myRealPart.subtract(b.myRealPart, mc), myImagPart.subtract(b.myImagPart, mc));
}
public BigComplex mul(BigComplex b, MathContext mc) {
return new BigComplex(myRealPart.multiply(b.myRealPart, mc).subtract(myImagPart.multiply(b.myImagPart, mc), mc), myRealPart.multiply(b.myImagPart, mc).add(b.myRealPart.multiply(myImagPart, mc), mc));
}
public BigComplex inv(MathContext mc) {
BigDecimal s = myRealPart.multiply(myRealPart, mc).add(myImagPart.multiply(myImagPart), mc);
return new BigComplex(myRealPart.divide(s, mc), myImagPart.divide(s, mc).negate());
}
public BigComplex div(BigComplex b, MathContext mc) {
return mul(b.inv(mc));
}
public Complex toComplex() {
return new Complex(myRealPart.doubleValue(), myImagPart.doubleValue());
}
@Override
public int intValue() {
return this.myRealPart.intValue();
}
@Override
public long longValue() {
return this.myRealPart.longValue();
}
@Override
public float floatValue() {
return this.myRealPart.floatValue();
}
@Override
public double doubleValue() {
return this.myRealPart.doubleValue();
}
}