舍入的Python问题

福萨

我在python 2.7中有一个舍入问题,导致意外输出。我正在尝试获得p1和p2的组合,总计总计不超过0.6或更少。

from itertools import product
P = []
p1 = [0.0,0.2,0.4,0.6]
p2 = [0.0,0.2,0.4,0.6] 
for p11,p22 in product(p1,p2):
    if p11+p22 <= max(p1):    
        P.append((p11,p22))

但是,当我运行此命令时,它不包括p11 + p22 = 0.6的所有值:

[(0.0, 0.0),
 (0.0, 0.2),
 (0.0, 0.4),
 (0.0, 0.6),
 (0.2, 0.0),
 (0.2, 0.2),
 (0.4, 0.0),
 (0.6, 0.0)]

我设置时它确实可以正常工作p11+p22 <= max(p1)+0.01对于不同的p1p2可能会或可能不会出现问题。我发现这种行为极其奇怪,导致非常不可靠的结果。

这可能与浮动精度问题有关。我认为这种行为在Python中不应该存在,因为R和Matlab也不具有这种行为。有没有解决这个问题的简单方法?

马丁·托马

怎么了?

计算机具有数字的内部表示形式。在大多数情况下,这些表示具有固定的位数。这导致只能表示固定数量的数字。例如,您可能知道诸如C之类的语言具有整数最大值。

类似地,您不能存储某些浮点数的确切表示。由于计算机使用以2为底的数字,所以以10为底的数字有一些简短的有限表示形式,但二进制的数字很长。有关更多详细信息,请参见IEEE 754

怎么可以“固定”?

这里没有什么要固定的,因为一切都按指定的方式进行。但是您必须了解这些类型的问题。当您知道存在问题的事实时,有两种解决方法。

要么使用epsilons(->不与精确数字进行比较,而是检查数字是否在数字附近很小的间隔内。此间隔的长度通常称为“ epsilon”),或使用任意精度表示形式(请参见fractions。仅当您可以影响数字在程序中的放置方式时,第二秒才起作用,例如

from itertools import product
from fractions import Fraction
P = []
p1 = [Fraction(0.0), Fraction(2, 10), Fraction(4, 10), Fraction(6, 10)]
p2 = [Fraction(0.0), Fraction(2, 10), Fraction(4, 10), Fraction(6, 10)]
for p11, p22 in product(p1, p2):
    if p11+p22 <= max(p1):
        P.append((p11, p22))

也可以看看

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章