如何高精度检查一个数是否为整数?
这里有个类似的问题:检查一个变量是否是整数,但我没有找到答案。
我最近在处理大数字,所以我的朋友建议我安装Python。我今天打开了它,想用它来计算大数字并保持高精度,但是……我该如何使用这种精度呢?我意思是,如果我做类似 pow(31,123)
的操作,它运行得很好,但如果我想检查一个数字是否是整数,我得到的结果是:
>>> (4.00000000000001).is_integer()
False
>>> (4.000000000000001).is_integer()
False
>>> (4.0000000000000001).is_integer()
True
>>> (4.00000000000000001).is_integer()
True
我想写一个简单的循环来找到一些丢番图方程的解,在这个方程中,我需要从一个非常大的数字中取平方根,并检查它是否是整数,但现在我遇到了困难。有人能帮我或者给我一些建议,如何获得更好的精度吗?
举个例子:
例如:$ 2x^2 = 1 + y^{31} $,其中x和y是整数。我的想法是做一个循环,从1开始递增y,先加1,再除以2,取平方根,然后这个结果必须是整数,才能满足方程。这就是我需要它的原因。
3 个回答
1
你能不能不使用内置的'type'函数?我运行了以下代码:
print type(4.0000000000000000000000000000000000000000000000001)
print type(4)
然后得到了这个结果:
<type 'float'>
<type 'int'>
接下来,你可以用find()方法检查结果中是否有'int'和'float'这两个词。
7
4.0000000000000001
这个数字在浮点数中无法准确表示:
>>> format(4.0000000000000001, '.53f')
'4.00000000000000000000000000000000000000000000000000000'
所以这个数字实际上是一个整数。在大多数系统中,你不能指望超过15位小数:
>>> sys.float_info.dig
15
可以查看 sys.float_info
这个结构,其中的 dig
属性表示:
浮点数中可以准确表示的小数位数的最大数量
如果你需要更高的精度,可以使用 decimal
模块。
1
你可以使用下面的代码来检查一个数字是否是某个整数的平方:
def is_square(x):
s = int(sqrt(x) + 0.5)
return s * s == x
对于丢番图方程(diophantine equation),也可以用类似的方法。只需将为某个给定的x找到的y转换为整数(y = int(y + 0.5)),然后检查对于找到的x和y,丢番图方程是否成立。