Тема 5

Напишите функцию estimatePi() для оценки и возврата значения числа Пи на основе формулы, найденной индийским математиком Шринивасой Рамануджаном. Он должен использовать цикл while для вычисления условий суммирования до тех пор, пока последний член не станет меньше 1e-15. Формула для оценки Пи приведена ниже: Согласно оценке Рамануджама

(Извините, я не могу загрузить изображение)

def estimatePi():
import math
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
k=0
final=0
pi=0
while pi<1e-15:
    a=factorial(4*k)
    b=(1103+26390*k)
    c=factorial(k)
    d=c**4
    e=396**(4*k)
    f=2*math.sqrt(2)/9801
    final+=(a*b*f)/(d*e)
    k+=1
    pi=1/final
return pi

и моя проблема заключается в следующем: ожидаемый ответ был = 3,14159265359 мой ответ = 3,14159273001

Я не смог найти свою ошибку :(. Может ли кто-нибудь помочь мне с этим?


person Fasna    schedule 09.08.2012    source источник
comment
Вы можете использовать функцию math.factorial(). Кроме того, я предлагаю вам вычислять с использованием целых чисел и откладывать преобразование в числа с плавающей запятой как можно дольше — у Python нет проблем с большими целыми числами для таких задач. С другой стороны, с плавающей запятой... с плавающей запятой - дерьмо для точности и математических вычислений.   -  person hochl    schedule 09.08.2012
comment
Спасибо, но опять тот же ответ :(   -  person Fasna    schedule 09.08.2012


Ответы (4)


Вы отвечаете правильно. Числа с плавающей запятой имеют проблемы с точностью, особенно для большого количества цифр после запятой; и при вычислении неточных значений.

Из вашего ответа видно, что он правильно оценил значение числа пи для 5 знаков после запятой.

person Burhan Khalid    schedule 09.08.2012
comment
Спасибо, но они просят одинаковый ответ - person Fasna; 09.08.2012

Пара вещей не так с вашим кодом, мой друг. Прежде всего, в своем коде помните, что переменная pi ни в какой форме не равна final. Вы вычисляете цикл while, который не повторяется, потому что число пи, очевидно, больше, чем 1e-15. Проще говоря, ваш код просто вычисляет формулу при k=0 и останавливается. Итак, вот один из возможных способов сделать это:

    def estimatePi():
        import math
        def factorial(n):
            if n == 0:
                return 1
            else:
                return math.factorial(n)
        k=1  # we want it at k=1 not 0 since we already have k=0 as Final
        Final=0.31830987844  #this is the value at k=0, the first value
        while Final>1e-15:   """ Note that 1e-15 is the limiting value and we want all b values that are less than 1e-15. k=2 is the final k value where b has the last smaller number than 1e-15.""" 

            b=(2*math.sqrt(2)/9801)*(factorial(4*k)*(1103+26390*k))/((factorial(k)**4)*(396**(4*k)))

            Final=Final+b
            k=k+1
            return 1/Final
   print estimatePi()
#This gives you the number you are looking for ---3.14159265359.
person eyoeldefare    schedule 26.12.2015

Вот мой код. Он возвращает результат так же, как требуется:

    import math
    def factorial(n): 
        if n == 0:
            return 1
        else:
            return n * factorial(n-1) 
    def estimatePi():
        f=2*math.sqrt(2)/9801
        k=0
        RHS = 0
        while True:
            num = factorial(4*k)*(1103+26390*k)
            den = (factorial(k))**4 * 396**(4*k)
            a = f*num/den
            RHS += a
            if a < 1e-15: break 
            k+=1
        return 1/RHS
person GSu    schedule 04.12.2016
comment
Возможно, нужно какое-то объяснение? - person Nissa; 04.12.2016

Проблема, с которой вы столкнулись, связана не с вашим кодом, а с вашим пониманием заданного вопроса. В проблеме указано:

Он должен использовать цикл while для вычисления условий суммирования до тех пор, пока последний член не станет меньше 1e-15.

Сделайте переменную равной 1, измените условие цикла while на чтение: while variable>=1e-15: и в цикле while установите вашу переменную равной ПОСЛЕДНЕМУ ТЕРМИНУ СУММИРОВАНИЯ. это должно дать вам более точное значение. Что бы это ни стоило, это генерирует правильное значение, но pyschools все еще не передал мой код.

person stanley    schedule 14.10.2013