如何计算一个非常非常大的数字并将其写入python中的文件?
How to calculate and write a very, very large number to a file in python?
这似乎是一个重复的问题,也许确实如此,但我检查了许多其他来源并且 none 的解决方案似乎有效。我要计算的数字是 999,999^999,999,它大得毫无意义,但我已经尝试了一段时间了。我想将结果写入文本文件。我通常会收到溢出错误,在尝试解决另一个问题后,我开始收到不同的溢出消息。有什么办法可以计算这个数字吗?如果 python 做不到,还有别的办法吗?
此时我的代码:
from decimal import Decimal
#Attempt 2 (Attempt 1 was just print(999999**999999))
a = Decimal(999999**999)
a = a**(2) #Not close enough. 2.0002895717 would be perfect, but that would cause another Overflow: "OverflowError: int too large to convert to float"
print(a)
open("number.txt","x").write(str(a))
#Attempt 3, I tried breaking down the power into it's square root, and then that into it's square roots
massiveNumber = Decimal(999999**31.6227608)
massiveNumber = Decimal(massiveNumber**Decimal(31.6227608))
massiveNumber = Decimal(massiveNumber**Decimal(31.6227608))
massiveNumber = Decimal(massiveNumber**Decimal(31.6227608))
open("number.txt","w").write(str(massiveNumber))
错误:
Traceback (most recent call last):
File "unknowablenumber.py", line 13, in <module>
massiveNumber = Decimal(massiveNumber**Decimal(31.6227608))
decimal.Overflow: [<class 'decimal.Overflow'>]
是的,decimal
可以准确、快速地完成,但您需要提高它使用的内部精度:
import decimal
with decimal.localcontext() as ctx:
ctx.prec = decimal.MAX_PREC
ctx.Emax = decimal.MAX_EMAX
ctx.Emin = decimal.MIN_EMIN
n = decimal.Decimal(999999)
huge = n ** n
s = str(huge)
print(len(s))
print (s[:10], "...", s[-10:])
显示:
5999994
3678796251 ... 9998999999
作为完整性检查,
>>> import math
>>> math.log10(999999) * 999999
5999993.565705735
>>> 10 ** .565705735
3.67879624904532
>>> pow(999999, 999999, 10**10)
9998999999
因此 decimal
的结果位数正确,前导数字匹配,最后 10 位完全正确。
这似乎是一个重复的问题,也许确实如此,但我检查了许多其他来源并且 none 的解决方案似乎有效。我要计算的数字是 999,999^999,999,它大得毫无意义,但我已经尝试了一段时间了。我想将结果写入文本文件。我通常会收到溢出错误,在尝试解决另一个问题后,我开始收到不同的溢出消息。有什么办法可以计算这个数字吗?如果 python 做不到,还有别的办法吗?
此时我的代码:
from decimal import Decimal
#Attempt 2 (Attempt 1 was just print(999999**999999))
a = Decimal(999999**999)
a = a**(2) #Not close enough. 2.0002895717 would be perfect, but that would cause another Overflow: "OverflowError: int too large to convert to float"
print(a)
open("number.txt","x").write(str(a))
#Attempt 3, I tried breaking down the power into it's square root, and then that into it's square roots
massiveNumber = Decimal(999999**31.6227608)
massiveNumber = Decimal(massiveNumber**Decimal(31.6227608))
massiveNumber = Decimal(massiveNumber**Decimal(31.6227608))
massiveNumber = Decimal(massiveNumber**Decimal(31.6227608))
open("number.txt","w").write(str(massiveNumber))
错误:
Traceback (most recent call last):
File "unknowablenumber.py", line 13, in <module>
massiveNumber = Decimal(massiveNumber**Decimal(31.6227608))
decimal.Overflow: [<class 'decimal.Overflow'>]
是的,decimal
可以准确、快速地完成,但您需要提高它使用的内部精度:
import decimal
with decimal.localcontext() as ctx:
ctx.prec = decimal.MAX_PREC
ctx.Emax = decimal.MAX_EMAX
ctx.Emin = decimal.MIN_EMIN
n = decimal.Decimal(999999)
huge = n ** n
s = str(huge)
print(len(s))
print (s[:10], "...", s[-10:])
显示:
5999994
3678796251 ... 9998999999
作为完整性检查,
>>> import math
>>> math.log10(999999) * 999999
5999993.565705735
>>> 10 ** .565705735
3.67879624904532
>>> pow(999999, 999999, 10**10)
9998999999
因此 decimal
的结果位数正确,前导数字匹配,最后 10 位完全正确。