Java 复数的大小
我正在做一个关于复数的项目,来解释更多(a+bi),其中“a”是复数的实部,“b”是复数的虚部。(a和b是实数,但“i”不是) 我很难实现一个数量级方法,我得到的不是一个实数,而是无穷大 这就是我试图实现的:|(a+bi)|=√(a^2+b^2) 我的代码片段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
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);
}