伙计们,我正在尝试使用python
来解决这个等式
我们需要找到的是一个值N,该等式给出的结果为2.718。 到目前为止我所做的有小数问题的是:
import math
from decimal import Decimal
import scipy.misc
limit = 2.718
ris = 0
n = 1
while ris <= limit:
ris = Decimal(n / math.pow(scipy.misc.factorial(n), 1/n))
n= n + 1
print(n,ris)
主要的问题是,在某一点上它开始只是打印零,我不知道它是否仍在计算但不再显示结果或它已经崩溃。
有什么想法解决这个问题吗?
答案 0 :(得分:3)
这个解决方案使用的是幂运算符**,它比pow更快,因为它没有函数加载和调用的开销。
import math
from decimal import Decimal
limit = Decimal(2.718)
result = 0
n = Decimal(1)
one = Decimal(1)
n_factor = Decimal(n)
while result <= limit:
result = n / Decimal(n_factor ** (one/n))
n += 1
n_factor *= n
# print (n, result) # uncomment to see intermediate results
print ('Final', n, result)
注意:它不是最佳的,但至少它会计算N
注意#2:请参阅下面的评论,了解有关'scipy'和Zeros的问题的解释
答案 1 :(得分:3)
来自Tim Rijavec和同义词的有趣答案。这是一些进一步的想法。
正如同义词所示,问题是,n = 171
scipy.misc.factorial
返回array(inf)
。这是因为当您在没有其他参数的情况下调用此函数时,它会返回一个浮点数。您可以将其设置为返回精确的整数值:
>>> scipy.misc.factorial(171)
array(inf)
>>> scipy.misc.factorial(171, exact = True)
1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000
>>>
因此,如果您如此重写程序,则不会出现错误:
from decimal import Decimal
import scipy.misc
limit = Decimal(2.718)
ris = 0
n = 1
one = Decimal(1)
while ris <= limit:
ris = n / Decimal(scipy.misc.factorial(n, exact= True) ** (one/n))
n= n + 1
print(n,ris)
但由于某种原因,它效率低下并且需要相当长的时间才能完成。在这种情况下,你可能想要缓解条件:
while abs(ris - limit) > 0.025:
ris = n / Decimal(scipy.misc.factorial(n, exact= True) ** (one/n))
n= n + 1