在python中区分大整数和近似整数

时间:2016-04-12 04:59:40

标签: python-3.x integer long-integer floating-accuracy math.sqrt

我想避免我的代码误认为整数的近似整数。例如,58106601358565889的平方根为241,053,109.00000001659385359763188,但当我使用以下布尔测试时,58106601358565889欺骗我认为它是一个完美的方块:

a = 58106601358565889
b = math.sqrt(a)
print(b == int(b))

精确度不一定是问题,因为如果我重新检查,我会得到正确的(假)结论:

print(a == b**2)

测试真实与近似整数的更好方法是什么? math.sqrt隐藏在我的代码中的另一个定义中,如果可能的话,我想避免插入方形平方根的检查。如果这不是一个好问题,我道歉;我是python的新手。

4 个答案:

答案 0 :(得分:1)

这不是区分整数和非整数的问题,因为b实际上是一个整数*。 Python float的精度不足以将a的平方根表示为足够的数字以获得其任何小数分量。你做的第二次检查:

print(a == b**2)

仅打印False,因为b是一个整数,b**2仍然不是a

如果要测试非常大的整数是否是精确的正方形,请考虑自己实现平方根算法。

*,如0小数部分,而不是isinstance(b, int)

答案 1 :(得分:0)

int的精确度不是问题 - 它是浮点数的有限精度

>>> import math
>>> math.sqrt(58106601358565889)
241053109.0
>>> math.sqrt(58106601358565889) - 241053109
0.0

我认为双重检查是明显的解决方案

答案 2 :(得分:0)

import numpy as np
import math
from decimal import *

a = 58106601358565889
b = np.sqrt(a)
c = math.sqrt(a)
d = Decimal(58106601358565889).sqrt()


print(d)
print(int(d))

print(c)
print(int(c))

print(b)
print(int(b))

o / p

241053109.0000000165938535976
241053109
241053109.0
241053109
241053109.0
241053109

我会说使用decimal

预期代码:

from decimal import *
d = Decimal(58106601358565889).sqrt()
print(d == int(d))

o / p

False

答案 3 :(得分:0)

您还可以查看gmpy2库。它具有计算整数平方根以及整数平方根加余数的函数。没有精确约束。

>>> import gmpy2
>>> gmpy2.isqrt(58106601358565889)
mpz(241053109)
>>> gmpy2.isqrt_rem(58106601358565889)
(mpz(241053109), mpz(8))
>>> 

免责声明:我保留gmpy2