处理Python数学运算的准确性
我试图编写一个简单的程序来确定输入整数是否是2的幂 我有以下代码。它将使处理Python数学运算的准确性,python,Python,我试图编写一个简单的程序来确定输入整数是否是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
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
如果要比较浮点数并允许有点浮点数不准确,通常会检查它们之间是否在某个允许的距离内(
如果abs(x-y)
)
但是,如果要确定整数是否为2的幂,可以这样做:
def ispoweroftwo(n):
return (n>0 and (n&-n)==n)
这是根据有符号数字的表示规则工作的
>>> ispoweroftwo(536870911)
False
>>> ispoweroftwo(536870912)
True
比较浮点数是否相等的方法是
abs(a-b)
,其中tolerance=1e-6
或一些类似的小数字。在您的情况下,它将只是abs(y)<1e-6
有关更多信息,请查看此处或一个流行的。如果您需要精度,并且不想自己重新发明精度控制盘,您可以看一看,它正是为这种目的而设计的(精确地对任何类型的大数进行复杂的数学运算)
有关
np.log2()
或a.math.log(536870912,2)
=29.00000000000000 4
相关math.log
不返回整数。它返回一个浮点数。这就是为什么你的divmod没有给你预期的结果。
import numpy as np
x = np.array([0, 1, 2, 2**4, 536870912])
np.log2(x)
# array([-Inf, 0., 1., 4., 29.])