java-如何按可能具有浮点值且没有适当的相等值的成员比较两个对象?
作者:互联网
我有一个生成的域对象库(在我的直接控制范围之外).在此库中,存在以下对象:
public class SomeObject {
public float someField;
public boolean equals(SomeObject cmp) {
if(someField != cmp.someField)
return false;
return true;
}
}
我想将SomeObject实例与给定的公差(或类似的“不精确”方法)进行比较. JAVA是否已有可用的库?
另外,我正在寻找nullSafe实现.
我已经检查了Spring的ObjectUtils和JAVA 7的Objects和Apache的commons-lang,它们对浮点数进行了逐位比较,而不是给我提供epsilon.
编辑
我不希望库选择容差,因为这将需要了解应用程序的具体情况.但是,如果我知道公差的值,那么可能存在这样的功能?
公共布尔等于(Object o1,Object o2,double toleranceToUseForThisComparison)
解决方法:
没有为此使用的库例程,也没有,因为没有一种通用的比较包含所有应用程序错误的数字的方法.
数值计算中可能发生的错误类型(无论是浮点运算还是其他形式的误差)包括相对于某些已知最终值的误差,绝对误差或相对于除最终值甚至输入值以外的某些值的误差,这些的组合等等.误差的大小范围可以从零到无穷大,甚至可以是非数值的(当计算过程中的误差产生NaN时).
为了确定可以容忍的错误,必须知道执行了哪些计算,在输入数据和中间值上存在什么界限以及错误地接受相等的两个数字(不会相等)会造成什么危害.如果精确计算,则等于;相反,如果错误拒绝,则将两个如果精确计算则等于的两个数相等地拒绝.
所有这些都是针对特定应用程序的,因此无法使用常规库例程来解决.解决此问题的大部分工作是分析错误并判断潜在选择的利弊.一旦完成这项工作,实际的比较就很容易了(测试两个数字之间的差异是否在判断为可接受的区间之内),以至于为它提供一个库例程几乎无法完成.
有人将这个问题视为“我们进行数值计算,会得到一些误差,该误差是由数值舍入而不是由实际的数学引起的,因此让我们忽略它.”但实际的问题是“此程序计算出错误的数字;我们如何从错误的数字中得到正确的答案?”
通常,您不能.没有库例程接受错误的数字作为参数并返回正确的答案作为结果.
总之,您必须查看代码和使用的编号,并确定可以接受的错误.
标签:floating-point,equals,java 来源: https://codeday.me/bug/20191122/2058383.html