我在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
。对于不同的p1
和p2
可能会或可能不会出现问题。我发现这种行为极其奇怪,导致非常不可靠的结果。
这可能与浮动精度问题有关。我认为这种行为在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] 删除。
我来说两句