处理Python数学运算的准确性

时间:2016-06-01 08:50:23

标签: python

我试图编写一个简单的程序来确定输入整数是否为2的幂。

我有以下代码。 n=5368709125368709122^29)的测试用例将失败。

我尝试使用格式编号,format(y,'12g')输出接近0但不等于03.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

3 个答案:

答案 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()documentationquickstart tutorial