Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理Python数学运算的准确性_Python - Fatal编程技术网

处理Python数学运算的准确性

处理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

我试图编写一个简单的程序来确定输入整数是否是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

如果要比较浮点数并允许有点浮点数不准确,通常会检查它们之间是否在某个允许的距离内(
如果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.])