Приблизительное число пи с использованием ряда - PullRequest
0 голосов
/ 24 января 2020

instructions on how to get the pi

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

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Некоторые замечания:

  • Тест term < EPSILON всегда True, когда n неравномерно, поэтому все останавливается слишком рано.
  • В задании просим не включите последний термин, поэтому перед добавлением термина к сумме необходим тест.
  • Вы включили 4 * в термин, хотя на самом деле он находится за пределами суммирования. Вы должны принять это во внимание, либо умножив EPSILON на 4, либо умножив в самом конце. Умножение только один раз в конце быстрее, чем умножение каждого отдельного члена.
  • Вычисление (-1) ** n может быть довольно медленным, если вам нужен только знак, который изменяется между нечетным и четным 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

0 голосов
/ 25 января 2020

В задании конкретно упоминается, что следующий член должен быть меньше эпсилона в абсолютное значение . Это означает, что вы должны использовать abs(term), чтобы получить положительное число. Каждое отрицательное число будет меньше, чем эпсилон. Ваше время должно проверить abs(term) > EPSILON.

...