2012-08-13 79 views
1

你能帮我解决这个问题吗?循环浮动范围

代码: -

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])

输出: -

2.1 start here 
2.0 
2.1 
2.2 
2.3 
2.4 
2.5 
2.6 
2.7 
2.8 
2.9 
2.3 start here 
2.0 
2.1 
2.2 
2.3 
2.4 
2.5 
2.6 
2.7 
2.8 
2.9 
3.0 start here 
2.0 
2.1 
2.2 
2.3 
2.4 
2.5 
2.6 
2.7 
2.8 
2.9 
[2.1] 

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

+0

看起来你已经发现了你的标记已经存在的问题 - 浮点。 – irrelephant 2012-08-13 05:56:15

+0

你的格式最初是不正确的(该函数不会编译),所以我必须根据你的示例输出来猜测你的意思。如果我猜错了,请纠正它。 – Gabe 2012-08-13 05:59:58

回答

0

它还取决于循环变量如何在蟒... 第(i + 1)循环的第值可能是任一

value[i] = startValue + i * increment 

value[i] = value[i-1] + increment 

在浮点中,这些值将是不同的...
所以,如果你想处理严格的浮点平等,你将不得不知道这种细节

此外,很难控制循环何时会停止......最后的值很可能是( 3.0厄普西隆)

第一个规则是浮点任何语言
使用整数,而不是不使用循环:

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 

另外请注意,我* 0.1和I/10.0可能会因为不同浮动0.1不完全是1/10 ...
因此,如果你写如果num ==(i * 0.1)它不会如你所期望的那样工作...
例如(23 * 0.1)==(23/10.0)是错误的,而最后碰巧严格等于浮点数2.3,它们都不同于数学分数23/10。

第二个规则告诉对浮动不使用严格的平等,这是很少有什么你觉得

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