Java 复数的大小

Java 复数的大小,java,complex-numbers,sqrt,Java,Complex Numbers,Sqrt,我正在做一个关于复数的项目,来解释更多(a+bi),其中“a”是复数的实部,“b”是复数的虚部。(a和b是实数,但“i”不是) 我很难实现一个数量级方法,我得到的不是一个实数,而是无穷大 这就是我试图实现的:|(a+bi)|=√(a^2+b^2) 我的代码片段 public double mag(){ /** * Compute the magnitude of this complex number. * */ //final double re

我正在做一个关于复数的项目,来解释更多(a+bi),其中“a”是复数的实部,“b”是复数的虚部。(a和b是实数,但“i”不是)

我很难实现一个数量级方法,我得到的不是一个实数,而是无穷大

这就是我试图实现的:|(a+bi)|=√(a^2+b^2)

我的代码片段

public double mag(){
    /**
     * Compute the magnitude of this complex number.
     * 
     */
    //final double re is the real part
    //final double I'm is the imaginary part 
    double mag = Math.sqrt(Math.pow(this.re, 2) + Math.pow(this.im, 2));

    return mag;
}

比方说,如果实数和虚数都是Double.MAX_值。为什么mag会返回无穷大而不是1.8961503816218352E154?

无穷大数是大于Double.MAX_值或小于-Double.MAX_值的数。1.0/0.0是无限的。2*Double.MAX_值也是如此

Math.pow(Double.MAX\u值,2)
明显大于
Double.MAX\u值。一个可能的最大数的平方将导致一些常规数字系统无法表示的结果

Math.sqrt(Math.pow(this.re, 2) + Math.pow(this.im, 2))
==> Math.sqrt(Math.pow(Double.MAX_VALUE, 2) + Math.pow(Double.MAX_VALUE, 2))
==> Math.sqrt(Infinity + Infinity)
==> Infinity

在可以计算sqrt之前,双最大值的平方会导致无穷大。你找不到无穷大数的sqrt,所以你得到的完全有效

对于双值,如果值超过
double.Max_值
,则返回
无穷大
。正如另一个答案所示,在您的情况下,它将返回无穷大。所以对于非常大的数字,你不能做简单的数学运算。对于这种操作,最好使用
BigDecimal

以返回1.8961503816218352E154 这样做


无穷大实际上是正确答案,因为<代码>席X+Xi > <代码>√2*| x |
,它总是大于
x
,任何大于
Double的值。浮点中的最大值定义为无穷大。感谢佛陀,我不知道我是如何忘记了双精度范围的。但你的答案绝对正确。然而,我绕过了JUnit测试人员,将mag声明为Math.hypot(this.re,this.im)。
    public double mag() {

     double x = this.re;
     double y = this.im;
     return Math.hypot(x, y);

}