#python #pi
#питон #pi
Вопрос:
Я новичок в Python и в настоящее время изучаю рабочую тетрадь по Python Бена Стивенсона. Я застрял в упражнении 69, и мое значение pi расходится …. кто-нибудь может помочь? Какие-либо ошибки в моем коде?
Я также приложил сюда вопрос с упражнением. Вопрос об упражнении
#Exercise 69: Approximate pi
maxrun = 15
denominator1 = 2
denominator2 = 3
denominator3 = 4
fractionpos = (4/(denominator1*denominator2*denominator3))
denominatora = 4
denominatorb = 5
denominatorc = 6
fractionneg = -4/(denominatora*denominatorb*denominatorc)
pi = 3
count = 1
while maxrun != 0:
if count %2 != 0: #odd runs are positive
pi = pi fractionpos
print('Approximation',count,'pi value is',pi)
count = count 1
denominator1 = denominator1 4
denominator2 = denominator2 4
denominator3 = denominator3 4
maxrun = maxrun-1
elif count %2 ==0: #even runs are negative
pi = pi fractionneg
print('Approximation',count,'pi value',pi)
count = count 1
denominatora = denominator1 4
denominatorb = denominator2 4
denominatorc = denominator3 4
maxrun = maxrun-1
Ответ №1:
Каждый раз, когда вы обновляете свои знаменатели, вам также нужно будет обновлять свою дробь. Прямо сейчас ваши fractionpos
и fractioneg
не меняются, и поэтому на каждой итерации вы добавляете исходные термины. Вот почему ваше приближение pi расходится.
Мы можем исправить это, обновив fractionpos
и fractionneg
после обновления наши знаменатели.
if count %2 != 0: #odd runs are positive
pi = pi fractionpos
print('Approximation',count,'pi value is',pi)
count = count 1
denominator1 = denominator1 4
denominator2 = denominator2 4
denominator3 = denominator3 4
fractionpos = (4/(denominator1*denominator2*denominator3))
maxrun = maxrun-1
else: #even runs are negative
pi = pi fractionneg
print('Approximation',count,'pi value',pi)
count = count 1
denominatora = denominator1 4
denominatorb = denominator2 4
denominatorc = denominator3 4
fractionneg = -4/(denominatora*denominatorb*denominatorc)
maxrun = maxrun-1
Комментарии:
1. Удивительно!! Я не знал, что мне нужно обновлять мои fractionpos и fractionneg, это сработало!
Ответ №2:
В вашем коде есть две проблемы:
pi = pi fractionpos # This does not work because its value stays the same.
fractionpos
и fractionneg
должен обновляться каждый раз, когда вы меняете знаменатели. Вы можете сделать это, переназначив им значение в цикле while.
В вашем elif
заявлении вы должны добавить 4 denominatora
вместо denominator1
, а также другие.
elif count %2 ==0: #even runs are negative
pi = pi fractionneg
print('Approximation',count,'pi value',pi)
count = count 1
denominatora = denominator1 4 # This goes wrong and the following as well
denominatorb = denominator2 4
denominatorc = denominator3 4
maxrun = maxrun-1
Комментарии:
1. Ах да, я обновил его сейчас, большое спасибо! Какое замечательное сообщество!
Ответ №3:
У вас есть две проблемы в этом коде.
Во-первых, когда вы выполняете отрицательную часть дроби, вы должны добавлять 4 к знаменателю, b, c вместо 1,2,3.
Во-вторых, fractionpos
и fractionneg
вычисляются только один раз. Вам нужно пересчитывать их на каждой итерации.
Кроме того, вы можете избавиться от denominatora,b, c и просто использовать 1,2,3 для обоих, если вы добавляете только по два в каждый цикл. Если вы хотите немного усложнить задачу, вы можете сделать это с помощью одной знаменательной переменной вместо трех
Поскольку вы изучаете Python и это упражнение для вас, я рекомендую вам не просто копировать приведенный ниже код, а вместо этого вносить изменения самостоятельно. Получайте удовольствие от Python!
if count %2 != 0: #odd runs are positive
pi = pi (4/(denominator1*denominator2*denominator3))
print('Approximation',count,'pi value is',pi)
count = count 1
denominator1 = denominator1 4
denominator2 = denominator2 4
denominator3 = denominator3 4
maxrun = maxrun-1
elif count %2 ==0: #even runs are negative
pi = pi -4/(denominatora*denominatorb*denominatorc)
print('Approximation',count,'pi value',pi)
count = count 1
denominatora = denominatora 4
denominatorb = denominatora 4
denominatorc = denominatora 4
maxrun = maxrun-1
Комментарии:
1. Удивительно!! Большое спасибо за вашу помощь!! Да, знаменатель123 должен быть abc (упс). Мне нравится ваше предложение просто добавлять 2 в каждый цикл, я боролся с чередованием положительных и отрицательных знаков, но я мог бы еще немного попрактиковаться и попытаться заставить это работать. 🙂