This is an automated email from the ASF dual-hosted git repository.
aherbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-numbers.git
The following commit(s) were added to refs/heads/master by this push:
new 41687683 NUMBERS-201: Update equals/hashCode to use numeric equality
for zero
41687683 is described below
commit 416876836497bb5bf18a75c3df510f1c4d609673
Author: aherbert <[email protected]>
AuthorDate: Fri Sep 29 16:29:16 2023 +0100
NUMBERS-201: Update equals/hashCode to use numeric equality for zero
The values -0.0 and 0.0 are considered equal.
---
.../org/apache/commons/numbers/field/FP64.java | 6 ++--
.../org/apache/commons/numbers/field/FP64Test.java | 37 ++++++++++++++++++----
2 files changed, 34 insertions(+), 9 deletions(-)
diff --git
a/commons-numbers-field/src/main/java/org/apache/commons/numbers/field/FP64.java
b/commons-numbers-field/src/main/java/org/apache/commons/numbers/field/FP64.java
index 7d996572..4768e2ad 100644
---
a/commons-numbers-field/src/main/java/org/apache/commons/numbers/field/FP64.java
+++
b/commons-numbers-field/src/main/java/org/apache/commons/numbers/field/FP64.java
@@ -108,7 +108,8 @@ public final class FP64 extends Number
public boolean equals(Object other) {
if (other instanceof FP64) {
final FP64 o = (FP64) other;
- return Double.doubleToLongBits(value) ==
Double.doubleToLongBits(o.value);
+ // Allow -0.0 to equal 0.0
+ return Double.doubleToLongBits(value + 0.0) ==
Double.doubleToLongBits(o.value + 0.0);
}
return false;
}
@@ -116,7 +117,8 @@ public final class FP64 extends Number
/** {@inheritDoc} */
@Override
public int hashCode() {
- return Double.hashCode(value);
+ // Same hash code for -0.0 and 0.0
+ return Double.hashCode(value + 0.0);
}
/** {@inheritDoc} */
diff --git
a/commons-numbers-field/src/test/java/org/apache/commons/numbers/field/FP64Test.java
b/commons-numbers-field/src/test/java/org/apache/commons/numbers/field/FP64Test.java
index 207d9ef7..6388c107 100644
---
a/commons-numbers-field/src/test/java/org/apache/commons/numbers/field/FP64Test.java
+++
b/commons-numbers-field/src/test/java/org/apache/commons/numbers/field/FP64Test.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.params.provider.ValueSource;
*/
class FP64Test {
@ParameterizedTest
- @ValueSource(doubles = {-5.67e89, -0.0, Double.POSITIVE_INFINITY})
+ @ValueSource(doubles = {-5.67e89, -0.0, 0.0, Double.POSITIVE_INFINITY})
void testConsistencyWithDouble(double v) {
final Double a = Double.valueOf(v);
final FP64 b = FP64.of(v);
@@ -36,8 +36,13 @@ class FP64Test {
Assertions.assertEquals(a.intValue(), b.intValue());
Assertions.assertEquals(a.longValue(), b.longValue());
Assertions.assertEquals(a.byteValue(), b.byteValue());
- Assertions.assertEquals(a.hashCode(), b.hashCode());
Assertions.assertEquals(a.toString(), b.toString());
+ // Hash code for -0.0 and 0.0 are the same
+ if (v == 0) {
+ Assertions.assertEquals(Double.valueOf(0.0).hashCode(),
b.hashCode());
+ } else {
+ Assertions.assertEquals(a.hashCode(), b.hashCode());
+ }
}
@Test
@@ -70,12 +75,30 @@ class FP64Test {
}
@Test
- void testOne() {
- Assertions.assertEquals(1d, FP64.of(-3.4).one().doubleValue());
+ void testEqualsZero() {
+ final FP64 a = FP64.of(-0.0);
+ final FP64 b = FP64.of(0.0);
+ Assertions.assertEquals(a, b);
+ Assertions.assertEquals(b, a);
+ Assertions.assertEquals(a.hashCode(), b.hashCode());
}
- @Test
- void testZero() {
- Assertions.assertEquals(0d, FP64.of(-3.4).zero().doubleValue());
+
+ @ParameterizedTest
+ @ValueSource(doubles = {-3.4, -0.0, 0.0, Double.POSITIVE_INFINITY})
+ void testOne(double value) {
+ final FP64 a = FP64.of(value);
+ Assertions.assertEquals(1d, a.one().doubleValue());
+ // Test definition
+ Assertions.assertEquals(a, a.one().multiply(a));
+ }
+
+ @ParameterizedTest
+ @ValueSource(doubles = {-3.4, -0.0, 0.0, Double.POSITIVE_INFINITY})
+ void testZero(double value) {
+ final FP64 a = FP64.of(value);
+ Assertions.assertEquals(0d, a.zero().doubleValue());
+ // Test definition
+ Assertions.assertEquals(a, a.zero().add(a));
}
@Test