![](/img/trans.png)
[英]Why does a very big double input return “Infinity” instead of error in Java?
[英]Why does this return Infinity? (Java)
我试图找到1/1 + 1/4 + 1/9 + 1/16 + 1/25的结果......
这些是我写的给出结果Infinity
:
public class BaselProblem {
public static void main(String[] args) {
int testLimit = 100000;
double sum = 0;
for (int i = 1; i<testLimit; i++)
{
sum = sum + 1.0/(i*i);
}
System.out.println(sum);
}
}
将1.0/(i*i)
更改为1/(1.0*i*i)
1.6449240667982423
1/(1.0*i*i)
可得到正确的结果1.6449240667982423
。 为什么只有第二种形式起作用但不起作用?
另外,因为(i*i) > 1
,那么1.0/(i*i)
应该< 1
,那么它如何导致Infinity
?
因为你的testLimit
以及你的i
被定义为int
。 由于你将表达式i*i
放在括号中,它将首先计算,并将尝试找到两个整数的倍数 - 这将很快达到溢出并重置为零。
具体来说,当i
达到2¹⁶时, i*i
将是2³²。 这意味着1后跟32个二进制零,其中只保留32个零,这意味着零。 (谢谢@templatetypedef)。
因此,您将有一个除以零的数字,即无穷大。
更改你的循环声明,以便i
是double
。 或者乘以i*i
左边的double(1.0)。 这将导致表达式在乘以第二个i
之前变为double
。
Java整数的最大值为2,147,483,647。 你最终会用i * i产生的整数超过那个最大值。
如果你做1.0 * i * i,你将结果转换为一个双倍,它可以保持最大值1.79769313486231570E + 308。
i * i的最大值将是10,000,000,双倍可以容纳,但整数不能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.