Python计算以3为底的对数精度问题(LeetCode3的幂判定)
解决3的幂问题中的对数精度误差
你遇到的精度问题是因为浮点数的二进制表示局限性,math.log(k, 3) 本质是通过自然对数转换计算的(math.log(k)/math.log(3)),而log(3)是无理数,导致计算结果出现微小的精度偏差,比如243的对数本该是5,却输出了4.999999999999999。
以下是基于对数的可靠解决方案:
方案一:对数计算+反向验证(推荐)
class Solution: def isPowerOfThree(self, n: int) -> bool: import math if n <= 0: return False # 计算以3为底的对数 log_val = math.log(n, 3) # 加极小值修正精度偏差后取整,得到理论上的整数指数 exp = int(log_val + 1e-10) # 反向验证3的该次方是否等于原数,彻底规避精度误判 return 3 ** exp == n
原理说明
- 加
1e-10是为了修正那些因精度问题略小于真实整数的对数结果(比如4.999999999999999),取整后得到正确的指数。 - 最后通过
3 ** exp == n反向验证,只有当n确实是3的幂时,这个等式才成立,完全避免了浮点数精度带来的误判。
方案二:用math.isclose判断对数是否接近整数
如果你能接受使用round(),配合严格的容差也能安全判断:
class Solution: def isPowerOfThree(self, n: int) -> bool: import math if n <= 0: return False log_val = math.log(n) / math.log(3) # 设置极小的容差,确保只有真正接近整数的对数才会被判定为相等 return math.isclose(log_val, round(log_val), rel_tol=1e-10, abs_tol=1e-10)
内容的提问来源于stack exchange,提问作者Talha Tayyab
相关产品推荐
相关产品推荐

