2024-04-17 22:28:00 发布
网友
我知道一般情况下,两个浮点值必须像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。在
f1
同时,假设您有一个f2,它正确地取整为3。如果将四舍五入的f1与四舍五入的f2进行比较,它们将是不相等的。在
f2
所以,在四舍五入之后,再考虑这些数字中可能存在的错误已经太晚了;这些信息都消失了。四舍五入后比较数字并不能告诉您精确的数学结果在舍入之前是否彼此接近。在
这个问题的解决方案取决于您的特定应用程序以及如何计算这些数字。没有普遍的解决办法。在
没有。 正如documentation所说
The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68.
所以答案仍然是浮点数,我们can't have any guarantee on its exact value。在
有一些例子,round()返回数字,但不能完全用浮点数表示,结果仍然需要使用epsilon进行适当的比较(例如round() in Python doesn't seem to be rounding properly)
round()
首先,没有必要像您建议的那样比较两个具有容错性的浮点。两个浮点数之间的关系取决于它们是如何导出的,这在应用程序之间有很大的不同。对此没有统一的答案。在
其次,当且仅当两个值相等时,两个舍入值的相等比较将返回true。允许任何类型的公差获得“近似等于”函数将没有效果(如果公差小于舍入距离)。在
但是,浮点中的舍入值是有问题的,因为小错误可能会将值从舍入点的一侧移到另一侧。例如,考虑将
f1
舍入为最接近的整数,其中f1
是使用包含舍入错误的浮点运算计算的某些值。(当一个运算的数学结果不完全可表示时,就会出现舍入误差,因此计算机必须将其四舍五入到最接近的可表示的结果。)如果f1
非常接近,比如2.5,它应该舍入到什么位置?显然,如果它小于2.5,它将四舍五入到2,如果它更大,它将四舍五入到3。但是假设用精确数学计算的f1
的理想值略大于2.5,但由于舍入误差,计算值略小于2.5。那么f1
将取整为2,但我们更希望它舍入到3。在同时,假设您有一个
f2
,它正确地取整为3。如果将四舍五入的f1
与四舍五入的f2
进行比较,它们将是不相等的。在所以,在四舍五入之后,再考虑这些数字中可能存在的错误已经太晚了;这些信息都消失了。四舍五入后比较数字并不能告诉您精确的数学结果在舍入之前是否彼此接近。在
这个问题的解决方案取决于您的特定应用程序以及如何计算这些数字。没有普遍的解决办法。在
没有。 正如documentation所说
所以答案仍然是浮点数,我们can't have any guarantee on its exact value。在
有一些例子,
round()
返回数字,但不能完全用浮点数表示,结果仍然需要使用epsilon进行适当的比较(例如round() in Python doesn't seem to be rounding properly)相关问题 更多 >
编程相关推荐