代码之家  ›  专栏  ›  技术社区  ›  Andrew Queisser

不同的linspace或arange都包含精确的0.0

  •  1
  • Andrew Queisser  · 技术社区  · 6 年前

    下面是一个失败的例子:

    >>> r1=np.arange(-.3,.6,.1)
    >>> r2=np.arange(-.5,.5,.1)
    >>> r1
    array([ -3.00000000e-01,  -2.00000000e-01,  -1.00000000e-01,
             5.55111512e-17,   1.00000000e-01,   2.00000000e-01,
             3.00000000e-01,   4.00000000e-01,   5.00000000e-01])
    >>> r2
    array([ -5.00000000e-01,  -4.00000000e-01,  -3.00000000e-01,
            -2.00000000e-01,  -1.00000000e-01,  -1.11022302e-16,
             1.00000000e-01,   2.00000000e-01,   3.00000000e-01,
             4.00000000e-01])
    >>> r1[3]
    5.5511151231257827e-17
    >>> r2[5]
    -1.1102230246251565e-16
    

    我希望r1[3]和r2[5]正好是0.0(假设IEEE-754)。我能看到的唯一解决方法是生成范围[-x0,0],然后追加[0,x1]。有没有更好的方法更容易阅读?

    1 回复  |  直到 6 年前
        1
  •  1
  •   user2357112    6 年前

    可以用任何比例因子乘以一个整数:

    r1 = np.arange(-3, 6) * 0.1
    

    或者,为了获得更高的精度(虽然不会影响0),请通过除以精确值10.0而不是乘以不精确值0.1来避免舍入步骤:

    r1 = np.arange(-3, 6) / 10.0
    

    使用 arange numpy.linspace ,但如果你需要 确切地 linspace 没有做出足够有力的承诺:

    >>> numpy.linspace(-2, 1, 148)[::49]
    array([-2.00000000e+00, -1.00000000e+00, -2.22044605e-16,  1.00000000e+00])
    >>> (numpy.arange(-2*49, 50) / 49)[::49]
    array([-2., -1.,  0.,  1.])