【发布时间】:2013-08-07 15:05:32
【问题描述】:
我必须比较两个数字。其中一个来自regulat python 代码,另一个来自numpy。调试器显示它们具有相同的值“29.0”,但第一个类型是float,第二个类型是float64,所以a == b 和a - b == 0 是False。我该如何处理?有没有办法
强制一个普通的python变量默认为float64或numpy使用float?
更新:最后,所有这些值都来自写入 29.0 的同一个文件,所以我认为数值没有差异。
【问题讨论】:
-
由于精度错误,通常将任何两个浮点数与
a == b或a - b == 0进行比较是一个坏主意。尝试做类似abs(a - b) < 1e-8之类的事情。 -
浮点表示和算术不精确(尾数和截断 pb)。设置最大差异的 epsilon(通常为 10e-10)。
-
虽然通常这些 cmets 似乎是正确的,但我无法想象值
29.0如果它来自一个可能是 ASCII 格式的文件会出现精度错误。 29.0 可以准确表示。 -
@glglgl 不一定。在二进制中,数字表示为 c × 2ⁿ。如果c=29,n=0,那么,是的,可以准确表示;但在某些浮点表示中,c≤0.5,在这种情况下可能无法准确表示。在我的系统上会出现 float(29.0)==float64(29.0),但这不能保证。
-
@glglgl 此外,OP说调试器说该值为29.0;他没有说价值从何而来。它很容易成为一个计算值,据我们所知,它可能是 29.00000000000001。