我试图编写一个简单的程序来确定输入整数是否为2的幂。
我有以下代码。 n=536870912
(536870912
是2^29
)的测试用例将失败。
我尝试使用格式编号,format(y,'12g')
输出接近0
但不等于0
,3.43965 e-07
。
我应该如何克服这个数字问题?
s= math.log(n,2)
[sh,y]=divmod(s,1)
if y!=0:
#if format(yu,'20f')!=format(0,'20f') :
return False
else:
return True
答案 0 :(得分:3)
如果你想比较浮点数并允许一点浮点不准确,你通常会检查它们是否在彼此的某个允许距离内(if abs(x-y) < epsilon
)。
但是,如果你想知道整数是2的幂,你可以这样做:
def ispoweroftwo(n):
return (n>0 and (n&-n)==n)
这符合签名号码的two's complement表示规则。
>>> ispoweroftwo(536870911)
False
>>> ispoweroftwo(536870912)
True
答案 1 :(得分:2)
比较浮点数是否相等的方法是abs(a - b) < tolerance
,其中tolerance = 1e-6
或类似的小数字。在你的情况下,它只是abs(y) < 1e-6
。
有关详细信息,请在此处查看Accuracy或热门SO question。
答案 2 :(得分:1)
如果你需要精确度并且你不想自己重新发明精确度轮,你可以看看NumPy,这是为这种目的而精确设计的(准确地进行复杂的数学运算)大量的任何类型)。
import numpy as np
x = np.array([0, 1, 2, 2**4, 536870912])
np.log2(x)
# array([-Inf, 0., 1., 4., 29.])
np.log2()
或documentation或quickstart tutorial。