如果您需要计算整数的精确立方根,那么您必须进行整数运算;没有办法解决这个问题。浮点算术不够精确,无法给出正确的立方根,即使正确的立方根可以精确地表示为浮点数。问题是它1/3
不能完全表示为浮点数,并且**
对浮点数的操作并不能对精度做出强有力的保证(与基本算术运算不同,它确实保证了正确的舍入)。
所以这里有一个使用二分搜索算法的解决方案,它纯粹通过整数算术工作,并且总是给出准确的结果:int_cube_root(x)
保证的结果是真正立方根的整数部分,即向零舍入的真正答案。
如果您想要完美立方体的精确答案,但想要非完美立方体的近似十进制答案,您可以将最后一行替换return sign * b
为return sign * x ** (1/3)
.
def int_cube_root(x):
if x >= 0:
sign = 1
else:
x = -x
sign = -1
a, b = 0, x
while a <= b:
m = (a + b) // 2
m3 = m * m * m
if m3 == x:
return sign * m
elif m3 < x:
a = m + 1
else:
b = m - 1
# uncomment for decimal answers when x is not a perfect cube
# return sign * x ** (1/3)
return sign * b
测试:
>>> int_cube_root(216)
6
>>> int_cube_root(215)
5
>>> int_cube_root(-27)
-3
>>> int_cube_root(-26)
-2
>>> int_cube_root(77777777777777777777 ** 3)
77777777777777777777
>>> int_cube_root(77777777777777777777 ** 3 - 1)
77777777777777777776