如何使用 python 中的小数有效计算立方根
How to efficiently calculate cube roots using decimal in python
我对使用 python 中的 decimal 模块还很陌生,我想知道计算立方根(或任何根)的最有效方法是什么。我试过 num ** (Decimal(1)/Decimal(3)
但花了很长时间。例如,下面的代码在 Intel i5 处理器上需要大约 20 秒 运行ning python 3:
from decimal import *
getcontext().prec = 10000
a0 = Decimal(3.0)
import time
beg = time.time()
cuber = a0**(Decimal(1)/Decimal(3))
end = time.time()
print(end-beg)
我知道可以做一些更好的事情,因为只需编写一个简单的牛顿算法就可以缩短 运行 时间(见下面的代码)。 那么,我的问题是什么是取小数整数根的好方法(最好是内置的)?
快速牛顿法,速度更快(~0.2 秒)如下:
def cube_root( A):
guess = (A-Decimal(1))/Decimal(3)
x0 = (Decimal(2) * guess + A / Decimal(guess*guess) )/Decimal(3.0)
while 1:
xn =(Decimal(2) * x0 + A / Decimal(x0*x0) )/Decimal(3.0)
if xn == x0:
break
x0 = xn
return xn
beg = time.time()
print(cuber - cube_root(a0))
end = time.time()
print(end-beg)
上面所有代码的示例输出,在我的系统上,是:
23.898984670639038
0E-9999
0.10790443420410156
对于如此低阶的立方根,牛顿法将是您最好的选择。我通过删除内部测试使循环更有效率,并且速度提高了大约 5%。删除多余的 Decimal
转化后又获得了 2-3%。
def cube_root( A):
d1 = Decimal(1)
d2 = Decimal(2)
d3 = Decimal(3)
x0 = (A-d1)/d3
xn = (d2 * x0 + A / Decimal(x0*x0) ) / d3
while xn != x0:
x0 = xn
xn = (d2 * x0 + A / Decimal(x0*x0) ) / d3
return xn
我对使用 python 中的 decimal 模块还很陌生,我想知道计算立方根(或任何根)的最有效方法是什么。我试过 num ** (Decimal(1)/Decimal(3)
但花了很长时间。例如,下面的代码在 Intel i5 处理器上需要大约 20 秒 运行ning python 3:
from decimal import *
getcontext().prec = 10000
a0 = Decimal(3.0)
import time
beg = time.time()
cuber = a0**(Decimal(1)/Decimal(3))
end = time.time()
print(end-beg)
我知道可以做一些更好的事情,因为只需编写一个简单的牛顿算法就可以缩短 运行 时间(见下面的代码)。 那么,我的问题是什么是取小数整数根的好方法(最好是内置的)?
快速牛顿法,速度更快(~0.2 秒)如下:
def cube_root( A):
guess = (A-Decimal(1))/Decimal(3)
x0 = (Decimal(2) * guess + A / Decimal(guess*guess) )/Decimal(3.0)
while 1:
xn =(Decimal(2) * x0 + A / Decimal(x0*x0) )/Decimal(3.0)
if xn == x0:
break
x0 = xn
return xn
beg = time.time()
print(cuber - cube_root(a0))
end = time.time()
print(end-beg)
上面所有代码的示例输出,在我的系统上,是:
23.898984670639038
0E-9999
0.10790443420410156
对于如此低阶的立方根,牛顿法将是您最好的选择。我通过删除内部测试使循环更有效率,并且速度提高了大约 5%。删除多余的 Decimal
转化后又获得了 2-3%。
def cube_root( A):
d1 = Decimal(1)
d2 = Decimal(2)
d3 = Decimal(3)
x0 = (A-d1)/d3
xn = (d2 * x0 + A / Decimal(x0*x0) ) / d3
while xn != x0:
x0 = xn
xn = (d2 * x0 + A / Decimal(x0*x0) ) / d3
return xn