import java.math.BigDecimal;
public class Complex {
private static final int DEF_DIV_SCALE=10;
private BigDecimal real;
private BigDecimal image;
private Complex(double real,double image){
this.real=BigDecimal.valueOf(real);
this.image=BigDecimal.valueOf(image);
}
private Complex(BigDecimal real,BigDecimal image){
this.real=real;
this.image=image;
}
private Complex(String realStr,String imageStr){
this.real=new BigDecimal(realStr);
this.image=new BigDecimal(imageStr);
}
public static Complex getComplex(double real,double image){
return new Complex(BigDecimal.valueOf(real),BigDecimal.valueOf(image));
}
private BigDecimal getReal(){
return real;
}
private BigDecimal getImage(){
return image;
}
//需要重写equals方法
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj!=null && obj.getClass()==Complex.class){
Complex cop=(Complex)obj;
if(this.getImage()==cop.getImage() && this.getReal()==cop.getReal()){
return true;
}
}
return false;
}
public String toString(){
if(getImage().compareTo(BigDecimal.valueOf(0))==0){
return getReal().toString();
}
if(getReal().compareTo(BigDecimal.valueOf(0))==0){
return getImage()+"*i";
}
if(getImage().compareTo(BigDecimal.valueOf(0))<0){
return getReal()+""+getImage()+"*i";
}
return getReal()+"+"+getImage()+"*i";
}
//我们还需要重写一个toString()和doubleValue()方法
//所有的前期工作完成后,我们该进行Complex的基本运算了
public Complex add(Complex c){
return new Complex(getReal().add(c.getReal()),getImage().add(c.getImage()));
}
public Complex subtract(Complex c){
return new Complex(getReal().subtract(c.getReal()),getImage().subtract(c.getImage()));
}
public Complex multiply(Complex c){
return new Complex(getReal().multiply(c.getReal()).subtract(getImage().multiply(c.getImage())),getReal().multiply(c.getImage()).add(getImage().multiply(c.getReal())));
}
public Complex divide(Complex c){
//为了避免大数吃小数,我们要提出较大的那个数
BigDecimal w;
if(c.getReal().abs().compareTo(c.getImage().abs())>0){
w=c.getReal().add(c.getImage().multiply(c.getImage()).divide(c.getReal(),DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP));
return new Complex((getReal().add(getImage().multiply((c.getImage().divide(c.getReal(),DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP))))).divide(w),getImage().subtract(getReal().multiply(c.getImage().divide(c.getReal(),DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP))).divide(w,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP));
}else{
w=c.getReal().multiply(c.getReal()).divide(c.getImage(),DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).add(c.getImage());
return new Complex((getReal().multiply(c.getReal().divide(c.getImage(),DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP)).add(getImage())).divide(w,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP),(getImage().multiply(c.getReal().divide(c.getImage(),DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).subtract(getReal()))).divide(w,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP));
}
}
public double abs(){
BigDecimal w;
//但是在这里又会出现很大的问题,如果其中一个是0怎么办?如果两个都是0又怎么办???
if(real.compareTo(BigDecimal.valueOf(0))!=0 && image.compareTo(BigDecimal.valueOf(0))!=0){
if(real.abs().compareTo(image.abs())>0){
w=real;
return BigDecimal.valueOf(w.abs().doubleValue()*Math.sqrt(BigDecimal.valueOf(1).add(image.divide(w,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).pow(2)).doubleValue())).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}else{
w=image;
return w.abs().doubleValue()*Math.sqrt(real.divide(w,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).pow(2).add(BigDecimal.valueOf(1)).doubleValue());
}
}else{
if(real.compareTo(BigDecimal.valueOf(0))==0 && image.compareTo(BigDecimal.valueOf(0))!=0){
return Math.abs(image.doubleValue());
}
if(real.compareTo(BigDecimal.valueOf(0))!=0 && image.compareTo(BigDecimal.valueOf(0))==0){
return Math.abs(real.doubleValue());
}
if(real.compareTo(BigDecimal.valueOf(0))==0 && image.compareTo(BigDecimal.valueOf(0))==0){
return 0;
}
}
return 0;
}
//我们同样需要提供一个方法用来获取它的副角
public double getArc(){
if(abs()==0){
//如果我们给的复数是0,那么我们怎么做?辐角也返回0
return 0;
}
return BigDecimal.valueOf(Math.asin(image.doubleValue()/abs())).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public Complex pow(double n){
//我们要先把complex转化成指数形式即:abs()*Math.exp(getArc())
//我们又该如何给pow指定一个小数范围呢???
return new Complex(Math.exp(Math.log(abs())*n)*Math.cos(n*getArc()),Math.exp(Math.log(abs())*n)*Math.sin(n*getArc()));
//return new Complex(BigDecimal.valueOf(Math.pow(abs(), n)*Math.cos(n*getArc())).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP),BigDecimal.valueOf(Math.pow(abs(), n)*Math.sin(n*getArc())).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP));
// return new Complex(BigDecimal.valueOf(Math.pow(abs(), n)*Math.cos(n*getArc())),BigDecimal.valueOf(Math.pow(abs(), n)*Math.sin(n*getArc())));
}
//我们接下来创建一个正弦和余弦静态方法
public static Complex sin(Complex c){
//我们该如何给sin指定一个小数范围
return new Complex(BigDecimal.valueOf(Math.cosh(c.getImage().doubleValue())*Math.sin(c.getReal().doubleValue())),BigDecimal.valueOf(Math.sinh(c.getImage().doubleValue())*Math.cos(c.getReal().doubleValue())));
}
public static Complex cos(Complex c){
//我们该如何给cos指定一个小数范围
return new Complex(BigDecimal.valueOf(Math.cosh(c.getImage().doubleValue())*Math.cos(c.getReal().doubleValue())),BigDecimal.valueOf(Math.sinh(c.getImage().doubleValue())*Math.sin(c.getReal().doubleValue())));
}
public static Complex sinh(Complex c){
return new Complex(BigDecimal.valueOf(Math.cos(c.getImage().doubleValue())*Math.sinh(c.getReal().doubleValue())).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP),BigDecimal.valueOf(Math.sin(c.getImage().doubleValue())*Math.cosh(c.getReal().doubleValue())).setScale(DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP));
}
public static Complex cosh(Complex c){
return new Complex(BigDecimal.valueOf(Math.cos(c.getImage().doubleValue())*Math.cosh(c.getReal().doubleValue())).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP),BigDecimal.valueOf(Math.sin(c.getImage().doubleValue())*Math.sinh(c.getReal().doubleValue())).setScale(DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP));
}
}