PI中不同位数的数字

4

我是Python的初学者,对于PI值有疑问。

>>> import math
>>> p = math.pi
>>> print p
3.14159265359
>>> math.pi
3.141592653589793
  • 为什么它们的数字位数不同?
  • 如何在不使用Chudnovsky算法的情况下得到更多小数位的Pi值?

2
请不要发布代码图片,只需发布代码本身。 - Tim
2
@TimCastelijns 我觉得如果我加上终端的图片,我的问题会显得更真实一些。 - Kshitij Saraogi
5
你可以在文本编辑器中输入任何内容并截屏,但这并不会比直接从Python终端复制粘贴结果更加真实。编辑问题时有一个代码块选项可以使用。将文本复制并保留为(HTML)文本的重要优势是其他人可以复制你的代码进行测试;而从图片中复制代码则不太容易。请记得使用代码块选项来展示你的代码。 - user707650
1
@Evert 谢谢建议。我将来会记住这个。 - Kshitij Saraogi
仅供参考,我的代码在此答案中可以使用Decimal模块计算大量pi位数。 它使用Salamin / Brent / Gauss算术-几何平均公式,因此收敛速度相当快。 - PM 2Ring
2个回答

14

为什么这两个数的位数不同?

一个是使用__str__计算的,另一个是使用__repr__计算的:

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

print使用对象的__str__返回值来确定要打印的内容。只是直接使用math.pi会使用__repr__

如何在不使用 Chudnovsky 算法的情况下获得更多小数位的 Pi 值?

您可以使用format()显示更多数字,例如:

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

20为小数点后的数字位数。更多信息请参考文档


3
请注意,在Python计算到小数点后48位之后,如果您要求更多的位数,它只会打印零。 - SuperBiasedMan
7
请注意,这个圆周率的值只精确到小数点后第15位。 - Alex Riley
1
@TimCastelijns 谢谢。我完全忘记了 str()repr() - Kshitij Saraogi
2
@KshitijSaraogi:浮点数不能可靠地保存更准确的π近似值在它们的低位上,因此一个可能的下一步是使用Python的“Decimal”类来存储数字。这给你任意有限的精度,但以内存和计算速度为代价。这真的取决于你的进一步要求是什么。 - Alex Riley
2
如@KshitijSaraogi所述:正如维基百科关于双精度浮点格式的文章中所提到的,对于某些值,您可以获得17位小数精度,但通常您不应依赖超过15位。 - PM 2Ring
显示剩余2条评论

3

print函数会在一定程度上对浮点数进行四舍五入。你可以使用以下方法来更改这个程度:

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

在这个特定的情况下:
print "%1.11f" % math.pi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接