Python:浮点数无限长度(高精度浮点数)

5

我的代码:

def calc_pi(acc):
     pos = False
     sum = 4.0
     for i in range(2, acc):
          if not pos:
               sum -= 4.0/(2*i-1)
               pos = True
          else:
               sum += 4.0/(2*i-1)
               pos = False
     return float(sum)

print(calc_pi(5000))

当然,我正在尝试计算一个带有10个小数点后数字的圆周率。但是Python似乎会四舍五入到10位。有没有简单的方法可以防止这种情况发生?例如一百万位小数点后?
谢谢!

1
可能不能让你赚到一百万,但是 decimal 可以让你赚到更多。 (https://docs.python.org/2/library/decimal.html) - NightShadeQueen
1
顺便说一句:你正在使用的算法非常慢,而且你实现它的方式引入了额外的舍入误差。如果你想自己计算圆周率,你可能需要研究更好的算法。 - user1084944
1
@Hurkyl 说得很有道理。但另一方面,在Python中这样做比仅此而已要多得多的开销——这只能是一个概念验证 :) - Marcus Müller
3个回答

8
您可以使用标准库提供的Decimal类。
来自文档:
与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可根据给定问题的需要调整大小。
  >>> from decimal import *
  >>> getcontext().prec = 6
  >>> Decimal(1) / Decimal(7)
  Decimal('0.142857')
  >>> getcontext().prec = 28
  >>> Decimal(1) / Decimal(7)
  Decimal('0.1428571428571428571428571429')

3
您可以使用Chudnovsky算法来计算π的100,000,000个小数位。另请参阅相关问题Python中的1000位PiPython计算π
如果您不想实现自己的算法,可以使用mpmath软件包。对于使用Chudnovsky级数的大约1000000个小数位:
from mpmath import mp
mp.dps = 1000000  # number of digits
print(mp.pi)   # calculate pi to a million digits (takes ~10 seconds)

2

Python内置的浮点数通常是64位IEEE754浮点数(通常称为“double”)。

您需要的是一种不是浮点数表示法,而是像Python整数类型一样可以任意增长的(二进制)数字。因此,我建议您查看分数整数表示法,并进行数学计算以在其中表示您的数字。


“那不是浮点表示法。” 实际上,他只是在寻找任意精度浮点表示法。由于π是无理数,将其计算到某个精度,然后寻找最接近的分数整数表示,会增加另一层复杂性。 - rth
@rth:嗯,如果整数的指数从未改变,则只有在需要浮点数时才需要。但他所有的迭代最终都会落在2和4之间,因此使用浮点数只会浪费所有指数位。在任意精度浮点数中可扩展的是尾数--但如果您只更改尾数,那么您的尾数就成为分数表示 :) - Marcus Müller
是的,但尾数始终是分数表示,所以按照这个逻辑,IEEE浮点数也不是浮点数^^。我想这是词汇的问题,无论人们用浮点数指的是IEEE浮点数,还是任何具有尾数和指数(每个位数都是任意的)的东西。 - rth
1
@rth 非常正确,你是对的。这个案例的特殊之处在于指数不会改变。 - Marcus Müller

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