【发布时间】:2017-03-21 16:00:28
【问题描述】:
我试图找到 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。为什么只有第二种形式有效,第一种无效?
还有,因为(i*i) > 1,那么1.0/(i*i)应该是< 1,那怎么会导致Infinity呢?
【问题讨论】:
-
i*i将溢出int并变为负数或零。但是1.0*i*i是双精度的,不受同种溢出的影响。你也可以使用long -
奇怪的是:它是100000个数字的总和,每个数字都是
-
你认为每个数字都是
<1,但当i达到65536时却不是。
标签: java math types casting type-conversion