Python2.6的浮点比较解决方案

Python2.6的浮点比较解决方案,python,floating-point,comparison,python-2.x,python-2.6,Python,Floating Point,Comparison,Python 2.x,Python 2.6,我正在做一个字符串值和浮点minValue和maxValue之间的简单比较,以检查值是否超出某个范围 if float(value) < minValue or float(value) > maxValue: # show error and exit 但是Decimal(str(minValue))看起来有点混乱,所以我想知道是否有更好的方法来比较两个浮点数,当它们是相同的值时不会失败,而不必先进行浮点数到字符串到十进制的转换 编辑 值来自csv文件,因此没有截断。你看

我正在做一个字符串值和浮点minValue和maxValue之间的简单比较,以检查值是否超出某个范围

if float(value) < minValue or float(value) > maxValue:
    # show error and exit
但是
Decimal(str(minValue))
看起来有点混乱,所以我想知道是否有更好的方法来比较两个浮点数,当它们是相同的值时不会失败,而不必先进行浮点数到字符串到十进制的转换

编辑

来自csv文件,因此没有截断。你看到的就是你得到的<然而,code>minValue是多项式函数的结果,但我不认为有任何截断或舍入

下面是计算minValue的函数

f = numpy.poly1d(coefficients)
x = range(int(low), int(high), 1)
y = f(x)
minValue = min(y)
maxValue = max(y)

它不工作的原因是因为
-1.234
不大于或小于
-1.234
<代码>-1.234>1.234为假,
-1.234<1.234
也为假。如果要使它们相等,则需要使用
=>
=>>值=-1.234
>>>最大值=-1.234
>>>最小值=-1.234
>>>浮动(值)
-1.234
>>>浮点(值)maxValue
假的
>>>浮动(值)=最大值
真的

注意,一般来说,如果没有
十进制
,这是无法解决的;浮点数学在许多计算中本质上是不精确的,逻辑上应该得到的
-1.234
很容易变成
-1.23399999998
-1.23400000000002
(仅用于说明,您的计算机可能会有所不同,但在我的计算机上,这两个值是最接近
-1.234
的值,它们最终不会四舍五入到
-1.234
的标准表示形式中;您的计算可能非常接近,或者可能相差稍远,但可能仍然是小于
0.00000000的错误。)001

这就是说,如果您碰巧确切地知道,您的值所需的精度不应超过
X
小数位,那么您通常可以通过使用更快的
float
,来确保您的值确实是最接近逻辑上应该的值的可表示值。因为它看起来是
minValue
maxValue
预先计算一次,只需更改最后一步即可将其舍入,例如:

minValue = round(min(y), 3)
maxValue = round(max(y), 3)
if round(float(value), 3) < minValue or round(float(value), 3) > maxValue:
这消除了任何虚假的多余精度。见鬼,如果你不确定自己需要多精确,只需加倍你的最佳猜测;在大多数情况下,你可能看到的不精确通常超过小数点后10位,因此如果你认为只需要3位,但你担心你仍然可能删除有效数据(例如,你可能有一个除以
8
的除法,可能会在末尾留下一个额外的有效
125
),只需再往上一点,四舍五入到
6
,甚至
9
小数位

同样,将执行比较的代码也更改为标准化
,例如:

minValue = round(min(y), 3)
maxValue = round(max(y), 3)
if round(float(value), 3) < minValue or round(float(value), 3) > maxValue:
如果舍入(浮点(值),3)maxValue:
或者更好(避免转换代码加倍):


如果不知道如何得到值,就很难回答这个问题。你确定
value
minValue
都是
-1.234
?如果你想“是的,我知道,因为我都打印了”,请记住,有许多浮点值仅略大于或小于-1.234,因此当它们的某些数字被截断时,会打印为“-1.234”。相关:另外:(是的,代码是Java的,但基本概念是相同的)同意@Kevin。几乎可以肯定的是,你有一系列数学运算来计算
minValue
和/或
value
,逻辑上会得到
-1.234
,但实际上会得到
-1.23400000000000000000003
(对于
value
)或
-1.233999999999999995
(对于
minValue
)或者诸如此类。当它们相等时,他们希望语句为false。也就是说,
value
允许与
minValue
相同,只是不能更小。测试是针对触发错误的越界条件,而不是越界条件,并且边界是包含性边界,而不是独占性边界。感谢您的详细响应。I think您是对的,这一定是浮点计算的性质导致了此问题。将最小值和最大值四舍五入到小数点后5位解决了我的问题,比较工作正常。我接受您的答案为正确。@max:很高兴它有帮助。如果可以,请花时间阅读更多有关此问题的信息(大多数体系结构和语言中浮点数学背后的规范),尤其是(又名C的
double
)这是Python的
float
对象的基本类型。当精度很重要时,它总是让你失望。我很欣赏资源链接,我会确保阅读更多关于浮点的内容。以防万一,所以你知道要意识到这种可能性:并非所有体系结构的浮点都符合IEEE 754。甚至当是的,它可能会根据编译器设置而有所不同(IEEE 754在操作顺序等方面有一些严格的规则,这些规则会抑制编译器优化,一些编译器会默认使用不太严格的规则来提高速度,除非明确告知不要这样做).我在一台机器上得到了
16.00…001
中的C计算结果,在另一台机器上得到了
15.99…994
中的C计算结果;被移植的代码将其转换为
int
,然后相乘;最后的值被关闭100.:-(哇,100的下界真的说明了从一个小的舍入不一致到完全超出范围的速度有多快。所以这个故事的寓意是你永远不能相信一个浮点数哈哈哈
if not minValue <= round(float(value), 3) <= maxValue: