【问题标题】:Approximate pi using series使用系列的近似 pi
【发布时间】:2020-01-24 20:56:37
【问题描述】:

def approximate_pi():
    EPSILON = 1.0e-7
    term = 1
    n = 0
    sum_pi = 0
    while term > EPSILON:
        term = 4 * (((-1) ** (n)) / (2 * n + 1))
        sum_pi += term
        n += 1
    print(float(round(sum_pi,10)))

这是我到目前为止的代码。我在这里做错了什么? 需要打印出3.1415924536

【问题讨论】:

  • 欢迎堆栈溢出!请检查您的缩进,给出的代码不会以当前格式运行。另外,请描述问题或您当前的输出与预期有何不同
  • 仔细查看作业中给出的公式。您的方法与公式不符。
  • 一个问题是第一次测试term > EPSILON 是False n 是不均匀的,使term 为负数。您似乎也包括了最后一个术语,而要求不包括它。
  • 欢迎来到 StackOverflow。见minimal, reproducible example。我们还希望您提供实际输出,通常是内部操作的跟踪。一两个简单的print 命令将显示您的几个问题。

标签: python series pi


【解决方案1】:

作业特别提到下一项在绝对值中必须小于 epsilon。这意味着您必须使用abs(term) 来获得一个正数。每个负数都将小于 epsilon。你的 while 应该检查abs(term) > EPSILON

【讨论】:

    【解决方案2】:

    一些备注:

    • n 不均匀时,测试term < EPSILON 始终为True,因此一切都过早停止。
    • 作业要求不包括最后一个术语,因此在将术语添加到总和之前需要进行测试。
    • 您将4 * 包含在术语中,而实际上它不在总和范围内。您需要考虑到这一点,或者将 EPSILON 乘以 4,或者在最后乘以。最后只乘一次比乘以每个单独的项要快。
    • 如果您只想要一个在奇数和偶数 n 之间变化的符号,计算 (-1) ** n 可能会非常慢。拥有一个在-1+1 之间不断切换的显式变量会更快。这也有助于始终将术语作为正数,从而无需在 EPSILON 测试中使用绝对值。
    def approximate_pi():
        EPSILON = 1.0e-7
        n = 0
        sum_pi = 0
        sign = 1
        while True:
            term = 1 / (2 * n + 1)
            if term < EPSILON:
                break
            sum_pi += sign * term
            n += 1
            sign = -sign
        return float(round(4 * sum_pi, 10))
    
    print(approximate_pi())
    

    这正好打印3.1415924536

    【讨论】:

    • 这个答案有帮助吗?
    猜你喜欢
    • 2015-12-30
    • 2018-03-22
    • 2023-03-16
    • 1970-01-01
    • 2022-07-08
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多