【发布时间】:2016-04-09 04:52:35
【问题描述】:
我写了一个程序用莱布尼茨公式计算PI数:
[
我写了一个初始化类型为“int”的for循环,循环工作正常,但是当我将初始化类型更改为“long”时,结果发生了变化。这只发生在循环次数超过十亿时。这使得“int-loop”计算 PI 比“long-loop”更准确。我不知道为什么会这样。请帮助我理解这个问题。谢谢!这是我的代码。
public static void main(String[] args) {
double result1 = 0;
double result2 = 0;
double sign = 1;
for (int i = 0; i <= 1607702095; i++) {
result1 += sign/(2 * i + 1);
sign *= -1;
}
sign = 1;
for (long j = 0; j <= 1607702095; j++) {
result2 += sign/(2 * j + 1);
sign *= -1;
}
System.out.println("result1 " + result1 * 4);
System.out.println("result2 " + result2 * 4);
System.out.println("pi " + Math.PI);
}
结果是:
result1 3.141592653576877
result2 3.1415926529660116
pi 3.141592653589793
【问题讨论】:
-
@programer310 那太好了:)。您现在看到了一个好问题的样子,并且您可以看到,其他用户通过投票表示赞赏。顺便说一句,当你点击edit 时,你可以看到它是如何格式化的(如果你好奇的话)。
-
如您所知,存在整数溢出。但也要小心初始化:
sign必须在第二个循环之前重置为 1 -
现在向您提出一个有趣的问题。假设您以几种不同的顺序进行计算。你从大的东西开始,然后向它们添加越来越小的东西。如果你从小端开始,逐渐添加越来越大的东西,你会得到不同的结果吗?如果你先做所有的负面,然后再做所有的正面呢?在“真实”算术中,执行一系列加法的顺序无关紧要。在Java中还有什么重要的吗?如果有区别,你能推断出为什么有区别吗?
-
@edc65 - 很好的一点 - 我试图弄清楚
long循环如何可能比int更准确。几乎可以肯定,因为答案较低,如果您的第一个(最大值)循环估计向下而不是向上,则可以预期。 -
@edc65 - 感谢您的评论,我根据您的建议编辑了我的代码。实际上结果并没有改变,因为在第一个循环之后,“sign”的值已经等于 1。