java对于复数的一些基本计算

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));
}
}

你可能感兴趣的:(java)