Python中如何解决内部取整问题:精确计算大数平方根
解决Python中超大整数的精确平方根计算问题
问题核心在于Python的float是双精度浮点数,有效位数仅15-17位左右,而你的数字998001983016242063有18位,直接用浮点运算(**0.5、math.sqrt、pow)会因精度丢失,把接近整数的结果直接取整成整数。
下面是两种可行的解决方案:
方案一:用decimal模块控制精度
decimal模块支持高精度十进制运算,手动设置足够精度就能算出精确结果:
from decimal import Decimal, getcontext # 设置精度为30位,足够覆盖当前需求 getcontext().prec = 30 a = Decimal(998001983016242063) sqrt_a = a.sqrt() print(sqrt_a) # 输出 999000491.999999000999500000...
方案二:用sympy库获取精确结果
如果需要严格的精确形式(或高精度数值),sympy的符号运算能满足需求:
from sympy import sqrt, Integer, N a = Integer(998001983016242063) sqrt_a = sqrt(a) print(sqrt_a) # 输出 sqrt(998001983016242063) # 转成高精度浮点数 print(N(sqrt_a, 30)) # 输出 999000491.999999000999500000250...
另外,也可以用整数运算验证平方根的整数部分:
a = 998001983016242063 x = 999000491 print(x*x) # 998001981018241081 print((x+1)*(x+1)) # 998001983016242064 # 可见a比(x+1)的平方小1,所以平方根是x + (a - x²)/(2x)的近似值,精确值为sqrt((x+1)² - 1)
内容的提问来源于stack exchange,提问作者Serg005
相关产品推荐
相关产品推荐

