smaller_cube函数有效范围探讨及int替换round的效果分析
寻找小于整数n的最大立方数函数分析
我写了一个函数smaller_cube,用来找出小于整数n的最大立方数,代码如下:
def smaller_cube(n): k = int(n**(1/3)) return k**3 if k**3 < n else (k-1)**3
现有代码的工作逻辑
- 比如计算
64**(1/3)时,浮点数运算结果是3.99999...,用int()截断后得到3,此时3**3=27 < 64,返回27,符合“小于64的最大立方数”的要求。 - 如果某个数的立方根计算结果是
4.00000...1(比如n略大于64),int()截断后得到4,4**3=64 < n,返回64;若n刚好等于64,此时4**3=64不小于n,会触发(k-1)**3分支返回27,同样符合需求。
存在的精度问题
当n是极大的整数时,浮点数计算n**(1/3)会出现精度丢失:
- 假设存在立方数
c³,且n > c³,但由于精度误差,n**(1/3)的计算结果小于c,此时int()截断后得到c-1,函数会返回(c-1)**3,而正确结果应该是c³。 - 当n大到一定程度,
n**(1/3)的计算会完全失准,连近似的整数部分都得不到,直接导致函数输出错误结果。
替换int为round的效果
- 原代码中
int()是直接截断小数部分,始终向下取整;round()则是根据小数部分判断,0.5及以上向上取整,否则向下取整。 - 替换后,对于立方根计算结果接近整数的情况,比如
c³的立方根计算为c-0.4,round会得到c,此时若c³ >=n,会返回(c-1)**3;若计算结果是c+0.4,round得到c,c³ <n则返回正确结果。 - 但这种替换无法解决大数的精度问题,反而可能在边界情况引入新错误:比如n略大于
c³,但立方根计算为c-0.5,round后得到c-1,函数会返回(c-1)**3,而正确结果应该是c³。
内容的提问来源于stack exchange,提问作者qwr
相关产品推荐
相关产品推荐

