python中Nilakantha系列中的术语

2024-10-02 22:30:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这很可能是一段非常简单的代码,但我似乎不知道它到底有什么问题。我每次都得到0作为答案,如果我试图直接使pi=pi,它会给我一个“float”错误,并说它不可调用。在

def pi(n):
  result = 0;
  N= int(input("Input desired iterations: "))
  M = 1.0
  denom = 2.0
  Pi = 3.0
  for I in range (1, N+1):
      Pi += ((4.0/(denom*(denom+1)*(denom+2.0)))*M)
      denom += 2.0
      M *= -1.0
  return n == Pi

m = int(input("M: "))
actual_pi =3.1415926535897932384626433832795028841971693993751058209749445923078164062
for i in range(0, 50000) : 
  val = pi(i)
  if (val - actual_pi) <= (10 ** m):
      print(i)
      break

我认为这应该是正确的代码,但是除了0我什么也得不到。This is the question I'm trying to solve. It also has the answer I should be getting.

编辑:我只是注意到我没有在照片中包括正确的号码。是24834。在


Tags: the答案代码inforinput错误pi
2条回答

解决这个问题的一个简单方法是为“Nilakantha Series”创建一个生成器,然后只enumerate()累积项,直到出现错误:

import itertools as it

Decimal = float
#from decimal import Decimal  # To use arbitrary precision decimal type

def nilakantha_series():
    yield Decimal(3)
    c = it.cycle([1, -1])
    for d in it.count(2, 2)
        yield Decimal(next(c)*4)/Decimal(d*(d+1)*(d+2))

def term_count(series, error, exact):
    for N, value in enumerate(it.accumulate(series)):
        if abs(value - exact) <= error:
            return N

In []:    
PI = Decimal('3.1415926535897932384626433832795028841971693993751058209749445923078164062')
M = 14
term_count(nilakantha_series(), 10**-M, PI)

Out[]:
24835

注意:如果您取消了import的注释并删除了Decimal = float,那么您将得到:

^{pr2}$

返回表达式n == Pi始终是False,它在算术上是0。只需返回Pi。在

EDIT2:输出仍然为0的原因是Pi(0)-actualPi<;10**M表示任何非负M

还有其他问题,可以通过将Pi测试放在Pi函数的循环中来避免,如下所示。在

actual_pi =3.1415926535897932384626433832795028841971693993751058209749445923078164062
def pi(testexp=14):

    M = 1.0
    denom = 2.0
    Pi = 3.0
    for i in range(50000):
        delta = abs(Pi - actual_pi)
        if not i % 1000: print(i, delta)
        if delta <= (10 ** -14):
            return i - 1  # Last iteration did not change Pi
        else:
            Pi += ((4.0/(denom*(denom+1)*(denom+2.0)))*M)
            denom += 2.0
            M *= -1.0

print(pi())
# 24834

相关问题 更多 >