Разное количество цифр в PI

Я новичок в Python, и у меня есть сомнения относительно PI.

>>> import math
>>> p = math.pi
>>> print p
3.14159265359
>>> math.pi
3.141592653589793
  • Почему они имеют разное количество цифр?
  • Как я могу получить значение числа Пи с большим количеством знаков после запятой без использования алгоритма Чудновского?

person Kshitij Saraogi    schedule 07.07.2015    source источник
comment
Пожалуйста, не размещайте изображения кода, просто размещайте сам код   -  person Tim    schedule 07.07.2015
comment
@TimCastelijns Я думал, что мой вопрос будет выглядеть более аутентично, если я добавлю изображение терминала.   -  person Kshitij Saraogi    schedule 07.07.2015
comment
Вы можете ввести что угодно в текстовом редакторе и сделать снимок экрана; это не сделает код более аутентичным, чем простое копирование и вставка результатов из терминала Python. Только для этого при редактировании вашего вопроса есть опция кодового блока. Большое преимущество копирования и вставки текста и сохранения его (HTML) текста в вашем вопросе заключается в том, что другие люди могут копировать и вставлять ваш код для тестирования; вы не можете (легко) скопировать и вставить код с картинки.   -  person    schedule 07.07.2015
comment
@Evert Спасибо за совет. Я буду иметь это в виду в будущем.   -  person Kshitij Saraogi    schedule 07.07.2015
comment
FWIW, мой код в этом ответе может вычислять большое количество цифр pi, используя модуль Decimal. Он использует формулу Саламина/Брента/Гаусса арифметико-геометрического среднего, поэтому сходится довольно быстро.   -  person PM 2Ring    schedule 07.07.2015


Ответы (2)


Почему они имеют разное количество цифр?

Один "вычислен" с __str__, другой с __repr__:

>>> print repr(math.pi)
3.141592653589793
>>> print str(math.pi)
3.14159265359

print использует возвращаемое значение __str__ объектов, чтобы определить, что печатать. Просто выполнение math.pi использует __repr__.

Как я могу получить значение Пи до большего количества знаков после запятой без использования алгоритма Чудновского?

Вы можете показать больше чисел с помощью format() вот так

>>> print "pi is {:.20f}".format(math.pi)
pi is 3.14159265358979311600

Где 20 - количество десятичных знаков. Дополнительные сведения см. в документах.

person Tim    schedule 07.07.2015
comment
Обратите внимание, что после 48 знаков после запятой Python просто напечатает нули, если вы попросите больше знаков. - person SuperBiasedMan; 07.07.2015
comment
Также обратите внимание, что это значение числа пи является точным только до 15-го знака после запятой. - person Alex Riley; 07.07.2015
comment
@TimCastelijns Спасибо. Я совершенно забыл о str() и repr(). - person Kshitij Saraogi; 07.07.2015
comment
@ajcr Я не могу не согласиться с тобой. У вас есть лучшее решение? - person Kshitij Saraogi; 07.07.2015
comment
@KshitijSaraogi: нельзя полагаться на то, что числа с плавающей запятой содержат более точные приближения числа пи в их младших битах, поэтому возможным следующим шагом является использование класса Python Decimal для хранения числа. Это дает вам произвольную конечную точность, но за счет памяти и скорости вычислений. Это действительно зависит от ваших дальнейших требований. - person Alex Riley; 07.07.2015
comment
@KshitijSaraogi: как упоминалось в статье Википедии о формате с плавающей запятой двойной точности , с некоторыми значениями вы получаете точность 17 десятичных знаков, но в целом не следует полагаться на более чем 15 цифр. - person PM 2Ring; 07.07.2015
comment
@SuperBiasedMan, можете ли вы объяснить, почему он ограничен всего 48 знаками после запятой? Я считаю, что для этого должно быть какое-то ограничение памяти, но мне просто любопытно узнать настоящую причину - person Amit Sharma; 16.10.2020

Функция print в некоторой степени округляет число с плавающей запятой. Вы можете изменить насколько, используя:

print "%1.<number>f" % math.pi

В этом конкретном случае:

print "%1.11f" % math.pi
person gustafbstrom    schedule 07.07.2015