我试图用这个公式计算pi的值:
我编写了这段代码,用于查找给定的n
:
def pisum(n):
sum=3.0
x=2.0
while (n>0):
if n%2==1:
sum=sum+(4/(x*(x+1)*(x+2)))
else :
sum=sum-(4/(x*(x+1)*(x+2)))
x=x+2
n=n-1
return str(sum)
它适用于n=0
和n=1
,并提供输出3.0,3.16666666667。但对于n=50
,输出应为3.1415907698497954,但它给出2.85840923015。为什么这么大的差异?如果我做错了,请帮忙纠正。
答案 0 :(得分:5)
问题是您使用n%2
来确定是否减去或添加。这不是你开始时应该重要的循环数量,而是你所处的循环。要看到这一点,请尝试将函数用于奇数,例如: 51,你会看到它会给你一个正确的答案。
要进一步说明,如果您从n=50
开始,您最初会从(4/(x*(x+1)*(x+2)))
中减去3
而不是添加n=51
,但如果您从def pisum(n):
sum = 3.0
x = 2.0
for i in range(n):
if i % 2 == 0:
sum = sum + (4 / (x * (x + 1) * (x + 2)))
else:
sum = sum - (4 / (x * (x + 1) * (x + 2)))
x = x + 2
return str(sum)
开始,那么最初会添加。
如果您按如下方式修改您的功能:
$('item').click(function() {
var itemNum = $(this).index() + 1;
var $leftArrow = $('#item' + itemNum + ' .left-arrow');
var $rightArrow = $('#item' + itemNum + ' .right-arrow');
$leftArrow.click(...);
$rightArrow.click(...);
});
您将始终获得正确的结果。
答案 1 :(得分:0)
你犯了一个小错误。
一个正确的程序:
def pisum(n):
sum = 3.
for i in xrange(2, 2*n+2, 2):
sum += (4. if (i&2) == 2 else -4.)/i/(i+1)/(i+2)
return sum
对于行数更加保守:
def pisum(n):
return 3. + sum([(4. if (i&2) == 2 else -4.)/i/(i+1)/(i+2) for i in xrange(2,2*n+2,2)])
你的错误: 你正在反向迭代n,因此你正在计算一次(n的奇数值):
并且正在计算
的另一个n值(除了0之外的偶数值)