我知道通常必须像 abs(f1-f2) < 1e-6 那样比较两个浮点数,但是如果在比较之前对它们进行舍入,那么在 Python 中比较它们的舍入值是否相等是否安全?
if round(f1,5)==round(f2,5):
print "equal"
else
print "unequal"
谢谢
我知道通常必须像 abs(f1-f2) < 1e-6 那样比较两个浮点数,但是如果在比较之前对它们进行舍入,那么在 Python 中比较它们的舍入值是否相等是否安全?
if round(f1,5)==round(f2,5):
print "equal"
else
print "unequal"
谢谢
首先,没有必要像您建议的那样比较两个具有容错性的浮点数。两个浮点数之间的关系取决于它们的派生方式,而这在应用程序之间差异很大。对此没有统一的答案。
其次,当且仅当值相等时,两个舍入值的相等比较才会返回 true。允许任何类型的公差获得“近似等于”函数将无效(如果公差小于舍入距离)。
但是,浮点数的舍入值是有问题的,因为小错误可能会将值从舍入点的一侧移动到另一侧。例如,考虑舍入f1
到最接近的整数,其中f1
是您使用包含舍入误差的浮点运算计算的某个值。(当运算的数学结果不能精确表示时,会出现舍入错误,因此计算机必须将其舍入到最接近的可表示结果。)如果f1
非常接近,比如 2.5,它应该舍入到什么?显然,如果小于 2.5,则舍入为 2,如果大于,则舍入为 3。但假设 的理想值f1
,用精确数学计算,略大于 2.5,但计算值为由于舍入误差,略小于 2.5。然后f1
将四舍五入到 2,但我们更希望它四舍五入到 3。
同时,假设您有一个f2
正确四舍五入为 3 的值。如果将 roundedf1
与 rounded进行比较f2
,它们将不相等。
因此,在对数字进行四舍五入之后,再考虑其中可能存在哪些错误已经太迟了;该信息消失了。在四舍五入后比较数字并不能告诉您精确的数学结果在四舍五入之前是否彼此接近。
解决方案取决于您的特定应用程序以及数字的计算方式。没有通用的解决方案。
不,如文档中所述,
浮点数的 round() 行为可能令人惊讶:例如,round(2.675, 2) 给出 2.67 而不是预期的 2.68。
所以答案仍然是浮点数,我们不能保证它的确切值。
有些示例round()
返回数字,不能完全表示为浮点数,结果仍然需要使用 epsilon 进行正确比较(例如,Python 中的 round() 似乎没有正确舍入)