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

Reply via email to