循环浮动范围 (Xunhuan fudong fanwei)

2024-06-11 20:55:44 发布

您现在位置:Python中文网/ 问答频道 /正文

你能帮我解决这个问题吗?在

在代码:-在

import numpy as np

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(2.0,3.0,0.1):
            print i
        if num==i: yesList.append(num)
    return yesList

print test([2.1,2.3,3.0])

在输出:-在

^{pr2}$

我希望它打印[2.1,2.3],但它只给了我[2.1],如图所示。在


Tags: 代码intestimportnumpyforheredef
2条回答

简而言之,您使用的是浮点数(不精确)并期望得到精确的结果,但最终会失败。冗长的答案要复杂得多,但是首先看一下this site's floating-point FAQ:Is floating point math broken?中的第一项(这是一个JavaScript问题,但它同样适用于所有语言)

它还取决于在python中循环变量是如何递增的。。。 循环的(i+1)-th值可以是

  value[i] = startValue + i * increment

或者

^{pr2}$

在浮点中,这些值将不同…
因此,如果要处理严格的浮点相等,就必须了解这种细节

而且,很难控制循环何时停止。。。最后一个值很可能是(3.0-epsilon)

第一条规则是无论使用哪种语言,都不要在浮点上使用循环
改用整数:

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(20,30,1):
            print i*0.1
            if num==(i/10.0): yesList.append(num)
    return yesList

还要注意,i*0.1和i/10.0可能不同,因为浮点0.1并不完全是1/10…
所以,如果你写if num==(i*0.1),它不会像你期望的那样工作…
例如(23*0.1)==(23/10.0)为假,虽然最后一个恰好严格等于浮点2.3,但它们都不同于数学分数23/10。在

第二条规则告诉我们不要在float上使用严格的相等,这很少是你所想的

def test(numList):
    yesList=[]
    for num in numList:
        print num, "start here"
        for i in np.arange(20,30,1):
            print i*0.1
            if abs(num-0.1*i) < 0.05 : yesList.append(num)
    return yesList

请阅读“每一位计算机科学家应该知道的浮点运算。”http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

相关问题 更多 >