gpt4 book ai didi

java - 如何为精度有限的 double 值编写正确的哈希码方法?

转载 作者:行者123 更新时间:2023-11-29 06:49:27 24 4
gpt4 key购买 nike

<分区>

如果 double 成员在另一个对象的给定范围内,则类 Foo 的对象被认为是相等的。由于浮点运算,很容易引入这样的错误。

方法 isDoubleEqualsdoubleArrayEquals 将处理相等部分,但契约(Contract)规定哈希码对于相等对象必须相同。 double 的默认哈希码不会将相近的值映射到相同的值,因此为匹配的 double 获取相同哈希值的好方法是什么?

public class Foo {

double[] values;

public Foo(double[] values) {
this.values = values;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
//TODO Arrays.hashCode will not work with the contract
result = prime * result + Arrays.hashCode(values);
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Foo other = (Foo) obj;
if (!doubleArrayEquals(values, other.values,1e-10))
return false;
return true;
}

private boolean doubleArrayEquals(double[] arr, double[] arr2, double epsilon) {
if (arr== arr2)
return true;
if (arr == null || arr2 == null)
return false;

int length = arr.length;
if (arr2.length != length)
return false;

for(int i = 0; i < length; i++) {
if(!isDoubleEquals(arr[i],arr2[i],epsilon)) {
return false;
}
}
return true;
}

private boolean isDoubleEquals(double needle, double target, double epsilon) {
return Math.abs(needle - target) <= epsilon;
}
}

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