gpt4 book ai didi

java - 如何按可能具有浮点值且没有适当等于的成员比较两个对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:49:39 26 4
gpt4 key购买 nike

我有一个生成的域对象库(在我的直接控制之外)。在此库中,存在以下对象:

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 的对象以及 Apache 的 commons-lang,它们对 float 进行了按位比较,而不是向我提供 epsilon。

编辑我不希望图书馆选择公差,因为这需要了解应用程序的细节。但是,如果我知道公差的值,这样的函数可能存在吗?

public boolean equals(Object o1, Object o2, double toUseForThisComparison)

最佳答案

没有用于此的库例程,也不可能有,因为没有适用于所有应用程序的比较包含错误的数字的通用方法。

数值计算(无论是 float 还是其他)中可能出现的错误类型包括与某个已知最终值相关的错误、绝对错误或与最终值以外的某个值相关的错误,甚至输入值、这些值的组合等等。误差的大小可以从零到无穷大,甚至可以是非数值的(当计算过程中的错误产生 NaN 时)。

为了确定可以容忍的错误,必须了解执行了哪些计算、输入数据和中间值的界限是什么,以及错误地接受两个相等的数字会造成什么危害如果计算准确则不相等,反之,错误地拒绝两个如果计算准确则相等的数字。

所有这些都是特定于应用程序的,因此不能用通用的库例程来解决。解决这个问题的大部分工作是分析错误并判断潜在选择的利弊。一旦这项工作完成,实际的比较就非常容易(测试两个数字之间的差异是否在判断可接受的区间内)以至于通过为其提供库例程几乎无法完成。

有些人将此问题视为“我们进行数值计算,我们得到了一些错误,错误是由数值四舍五入引起的,而不是实际数学造成的,所以让我们忽略它。”但实际问题是“这个程序计算错误的数字;我们如何从错误的数字中得到正确的答案?”

一般来说,你不能。没有接受错误数字作为参数并返回正确答案作为结果的库例程。

总而言之,您必须查看您的代码和您正在使用的数字,并找出您可以接受的错误。

关于java - 如何按可能具有浮点值且没有适当等于的成员比较两个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21047100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com