Python除法后防浮点数转换及精度问题求助
解决Super Coordinate Sums中的整数运算问题
你遇到的两个版本函数都有各自的问题:
- 第一个函数的问题:
def super_sum(d, n): return int((n - 1) * d / 2) * n ** d
当d为奇数且n为偶数时,(n-1)是奇数,奇数乘奇数d的结果还是奇数,除以2会得到带.5的小数。int()会直接截断小数部分,相当于把结果少算了0.5 * n**d,导致错误。
- 第二个函数的问题:
def super_sum(d, n): return int((n - 1) * d / 2 * n ** d)
把整个表达式转成浮点数计算后再转整数,但Python的浮点数(默认是64位)只有约15-17位有效数字。当d和n较大时,n**d会变成极大的整数,浮点数无法精确存储这么大的数,计算时会丢失精度,最终结果出错。
正确的解决方案:全程使用整数运算
因为(n-1)*d*n**d这个乘积必然是偶数:
- 如果
n是偶数,n**d包含因子2,整个乘积是偶数 - 如果
n是奇数,n-1是偶数,整个乘积也是偶数
所以可以先计算所有乘法,再用整数整除2,全程避免浮点数和截断问题:
def super_sum(d, n): return (n - 1) * d * (n ** d) // 2
这个版本:
- 完全用整数运算,没有浮点数精度丢失的问题
- 整除操作是精确的,因为乘积必然是偶数,不会出现小数部分被截断的情况
测试你提到的d=129、n=48的场景,这个函数会返回精确的正确结果,不会出现精度偏差。
内容的提问来源于stack exchange,提问作者bable
相关产品推荐
相关产品推荐

