Merge branch 'master' into 1.0-beta1-release; including release fixes from master.
diff --git a/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContext.java b/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContext.java
index bfa6446..e9a5121 100644
--- a/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContext.java
+++ b/commons-geometry-core/src/main/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContext.java
@@ -94,7 +94,7 @@
 
         final EpsilonDoublePrecisionContext other = (EpsilonDoublePrecisionContext) obj;
 
-        return this.epsilon == other.epsilon;
+        return Double.compare(this.epsilon, other.epsilon) == 0;
     }
 
     /** {@inheritDoc} **/
diff --git a/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContextTest.java b/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContextTest.java
index e0e26f9..d8d4164 100644
--- a/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContextTest.java
+++ b/commons-geometry-core/src/test/java/org/apache/commons/geometry/core/precision/EpsilonDoublePrecisionContextTest.java
@@ -209,6 +209,25 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final EpsilonDoublePrecisionContext a = new EpsilonDoublePrecisionContext(0.0);
+        final EpsilonDoublePrecisionContext b = new EpsilonDoublePrecisionContext(-0.0);
+        final EpsilonDoublePrecisionContext c = new EpsilonDoublePrecisionContext(0.0);
+        final EpsilonDoublePrecisionContext d = new EpsilonDoublePrecisionContext(-0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+        Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final EpsilonDoublePrecisionContext a = new EpsilonDoublePrecisionContext(1d);
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
index b046c8a..ed968fe 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/oned/Vector1D.java
@@ -277,18 +277,16 @@
      */
     @Override
     public boolean equals(final Object other) {
-
         if (this == other) {
             return true;
         }
-
         if (other instanceof Vector1D) {
             final Vector1D rhs = (Vector1D) other;
             if (rhs.isNaN()) {
                 return this.isNaN();
             }
 
-            return x == rhs.x;
+            return Double.compare(x, rhs.x) == 0;
         }
         return false;
     }
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java
index ab46582..bbda043 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java
@@ -24,7 +24,6 @@
 import org.apache.commons.geometry.euclidean.internal.Vectors;
 import org.apache.commons.geometry.euclidean.threed.rotation.QuaternionRotation;
 import org.apache.commons.numbers.arrays.LinearCombination;
-import org.apache.commons.numbers.core.Precision;
 
 /** Class using a matrix to represent affine transformations in 3 dimensional Euclidean space.
  *
@@ -442,20 +441,20 @@
 
         final AffineTransformMatrix3D other = (AffineTransformMatrix3D) obj;
 
-        return Precision.equals(this.m00, other.m00) &&
-                Precision.equals(this.m01, other.m01) &&
-                Precision.equals(this.m02, other.m02) &&
-                Precision.equals(this.m03, other.m03) &&
+        return Double.compare(this.m00, other.m00) == 0 &&
+                Double.compare(this.m01, other.m01) == 0 &&
+                Double.compare(this.m02, other.m02) == 0 &&
+                Double.compare(this.m03, other.m03) == 0 &&
 
-                Precision.equals(this.m10, other.m10) &&
-                Precision.equals(this.m11, other.m11) &&
-                Precision.equals(this.m12, other.m12) &&
-                Precision.equals(this.m13, other.m13) &&
+                Double.compare(this.m10, other.m10) == 0 &&
+                Double.compare(this.m11, other.m11) == 0 &&
+                Double.compare(this.m12, other.m12) == 0 &&
+                Double.compare(this.m13, other.m13) == 0 &&
 
-                Precision.equals(this.m20, other.m20) &&
-                Precision.equals(this.m21, other.m21) &&
-                Precision.equals(this.m22, other.m22) &&
-                Precision.equals(this.m23, other.m23);
+                Double.compare(this.m20, other.m20) == 0 &&
+                Double.compare(this.m21, other.m21) == 0 &&
+                Double.compare(this.m22, other.m22) == 0 &&
+                Double.compare(this.m23, other.m23) == 0;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinates.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinates.java
index cdab529..b7415e7 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinates.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinates.java
@@ -181,14 +181,15 @@
         if (this == other) {
             return true;
         }
-
         if (other instanceof SphericalCoordinates) {
             final SphericalCoordinates rhs = (SphericalCoordinates) other;
             if (rhs.isNaN()) {
                 return this.isNaN();
             }
 
-            return (radius == rhs.radius) && (azimuth == rhs.azimuth) && (polar == rhs.polar);
+            return Double.compare(radius, rhs.radius) == 0 &&
+                    Double.compare(azimuth, rhs.azimuth) == 0 &&
+                    Double.compare(polar, rhs.polar) == 0;
         }
         return false;
     }
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
index de90eab..acf0d65 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/Vector3D.java
@@ -399,10 +399,10 @@
         if (isNaN()) {
             return 642;
         }
-        return 643 * (164 * Double.hashCode(x) +  3 * Double.hashCode(y) +  Double.hashCode(z));
+        return 643 * (164 * Double.hashCode(x) + 3 * Double.hashCode(y) + Double.hashCode(z));
     }
 
-    /**
+    /**d
      * Test for the equality of two vector instances.
      * <p>
      * If all coordinates of two vectors are exactly the same, and none are
@@ -426,14 +426,15 @@
         if (this == other) {
             return true;
         }
-
         if (other instanceof Vector3D) {
             final Vector3D rhs = (Vector3D) other;
             if (rhs.isNaN()) {
                 return this.isNaN();
             }
 
-            return (x == rhs.x) && (y == rhs.y) && (z == rhs.z);
+            return Double.compare(x, rhs.x) == 0 &&
+                    Double.compare(y, rhs.y) == 0 &&
+                    Double.compare(z, rhs.z) == 0;
         }
         return false;
     }
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequence.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequence.java
index 1f42ee7..494a3f1 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequence.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequence.java
@@ -19,8 +19,6 @@
 import java.util.Arrays;
 import java.util.Objects;
 
-import org.apache.commons.numbers.core.Precision;
-
 /** <p>
  * Class representing a sequence of axis-angle rotations. These types of
  * rotations are commonly called <em>Euler angles</em>, <em>Tait-Bryan angles</em>,
@@ -158,9 +156,9 @@
 
         return this.referenceFrame == other.referenceFrame &&
                 this.axisSequence == other.axisSequence &&
-                Precision.equals(this.angle1, other.angle1) &&
-                Precision.equals(this.angle2, other.angle2) &&
-                Precision.equals(this.angle3, other.angle3);
+                Double.compare(this.angle1, other.angle1) == 0 &&
+                Double.compare(this.angle2, other.angle2) == 0 &&
+                Double.compare(this.angle3, other.angle3) == 0;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2D.java
index 17ff26b..0b7f658 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2D.java
@@ -24,7 +24,6 @@
 import org.apache.commons.geometry.euclidean.internal.Vectors;
 import org.apache.commons.geometry.euclidean.twod.rotation.Rotation2D;
 import org.apache.commons.numbers.arrays.LinearCombination;
-import org.apache.commons.numbers.core.Precision;
 
 /** Class using a matrix to represent affine transformations in 2 dimensional Euclidean space.
 *
@@ -397,13 +396,13 @@
 
         final AffineTransformMatrix2D other = (AffineTransformMatrix2D) obj;
 
-        return Precision.equals(this.m00, other.m00) &&
-                Precision.equals(this.m01, other.m01) &&
-                Precision.equals(this.m02, other.m02) &&
+        return Double.compare(this.m00, other.m00) == 0 &&
+                Double.compare(this.m01, other.m01) == 0 &&
+                Double.compare(this.m02, other.m02) == 0 &&
 
-                Precision.equals(this.m10, other.m10) &&
-                Precision.equals(this.m11, other.m11) &&
-                Precision.equals(this.m12, other.m12);
+                Double.compare(this.m10, other.m10) == 0 &&
+                Double.compare(this.m11, other.m11) == 0 &&
+                Double.compare(this.m12, other.m12) == 0;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinates.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinates.java
index bcaf2bc..bb66412 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinates.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinates.java
@@ -151,14 +151,14 @@
         if (this == other) {
             return true;
         }
-
         if (other instanceof PolarCoordinates) {
             final PolarCoordinates rhs = (PolarCoordinates) other;
             if (rhs.isNaN()) {
                 return this.isNaN();
             }
 
-            return (radius == rhs.radius) && (azimuth == rhs.azimuth);
+            return Double.compare(radius, rhs.radius) == 0 &&
+                    Double.compare(azimuth, rhs.azimuth) == 0;
         }
         return false;
     }
diff --git a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
index 1cdd869..091ec4c 100644
--- a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
+++ b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/Vector2D.java
@@ -342,7 +342,7 @@
         if (isNaN()) {
             return 542;
         }
-        return 122 * (76 * Double.hashCode(x) +  Double.hashCode(y));
+        return 122 * (76 * Double.hashCode(x) + Double.hashCode(y));
     }
 
     /**
@@ -369,14 +369,14 @@
         if (this == other) {
             return true;
         }
-
         if (other instanceof Vector2D) {
             final Vector2D rhs = (Vector2D) other;
             if (rhs.isNaN()) {
                 return this.isNaN();
             }
 
-            return (x == rhs.x) && (y == rhs.y);
+            return Double.compare(x, rhs.x) == 0 &&
+                    Double.compare(y, rhs.y) == 0;
         }
         return false;
     }
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/AffineTransformMatrix1DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/AffineTransformMatrix1DTest.java
index e4bd869..bdec5ad 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/AffineTransformMatrix1DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/AffineTransformMatrix1DTest.java
@@ -734,6 +734,24 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(0.0, -0.0);
+        final AffineTransformMatrix1D b = AffineTransformMatrix1D.of(-0.0, 0.0);
+        final AffineTransformMatrix1D c = AffineTransformMatrix1D.of(0.0, -0.0);
+        final AffineTransformMatrix1D d = AffineTransformMatrix1D.of(-0.0, 0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(1, 2);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/Vector1DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/Vector1DTest.java
index 98cc9fb..a392736 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/Vector1DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/oned/Vector1DTest.java
@@ -599,6 +599,25 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final Vector1D a = Vector1D.of(0.0);
+        final Vector1D b = Vector1D.of(-0.0);
+        final Vector1D c = Vector1D.of(0.0);
+        final Vector1D d = Vector1D.of(-0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+        Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final Vector1D v = Vector1D.of(3);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3DTest.java
index e0e848c..aca1c30 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3DTest.java
@@ -1181,6 +1181,35 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final double[] arrWithPosZero = {
+            1.0, 0.0, 0.0, 0.0,
+            0.0, 1.0, 0.0, 0.0,
+            0.0, 0.0, 1.0, 0.0,
+        };
+        final double[] arrWithNegZero = {
+            1.0, 0.0, 0.0, 0.0,
+            0.0, 1.0, 0.0, 0.0,
+            0.0, 0.0, 1.0, -0.0,
+        };
+        final AffineTransformMatrix3D a = AffineTransformMatrix3D.of(arrWithPosZero);
+        final AffineTransformMatrix3D b = AffineTransformMatrix3D.of(arrWithNegZero);
+        final AffineTransformMatrix3D c = AffineTransformMatrix3D.of(arrWithPosZero);
+        final AffineTransformMatrix3D d = AffineTransformMatrix3D.of(arrWithNegZero);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+        Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final AffineTransformMatrix3D a = AffineTransformMatrix3D.of(
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinatesTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinatesTest.java
index ca3e220..2f740df 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinatesTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/SphericalCoordinatesTest.java
@@ -321,6 +321,25 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final SphericalCoordinates a = SphericalCoordinates.of(0.0, -0.0, 0.0);
+        final SphericalCoordinates b = SphericalCoordinates.of(-0.0, 0.0, -0.0);
+        final SphericalCoordinates c = SphericalCoordinates.of(0.0, -0.0, 0.0);
+        final SphericalCoordinates d = SphericalCoordinates.of(-0.0, 0.0, -0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+        Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final SphericalCoordinates sph = SphericalCoordinates.of(1, 2, 3);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/Vector3DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/Vector3DTest.java
index b89fa71..06b1d3f 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/Vector3DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/Vector3DTest.java
@@ -1103,6 +1103,24 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final Vector3D a = Vector3D.of(0.0, -0.0, 0.0);
+        final Vector3D b = Vector3D.of(-0.0, 0.0, -0.0);
+        final Vector3D c = Vector3D.of(0.0, -0.0, 0.0);
+        final Vector3D d = Vector3D.of(-0.0, 0.0, -0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final Vector3D v = Vector3D.of(1, 2, 3);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequenceTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequenceTest.java
index 5494fcf..05800ff 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequenceTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/threed/rotation/AxisAngleSequenceTest.java
@@ -81,6 +81,29 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final AxisAngleSequence a = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ,
+                0.0, -0.0, 0.0);
+        final AxisAngleSequence b = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ,
+                -0.0, 0.0, -0.0);
+        final AxisAngleSequence c = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ,
+                0.0, -0.0, 0.0);
+        final AxisAngleSequence d = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ,
+                -0.0, 0.0, -0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+        Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final AxisAngleSequence seq = new AxisAngleSequence(AxisReferenceFrame.ABSOLUTE, AxisSequence.XYZ, 1, 2, 3);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2DTest.java
index 3e8d39d..6eedde8 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/AffineTransformMatrix2DTest.java
@@ -1188,6 +1188,33 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final double[] arrWithPosZero = {
+            1.0, 0.0, 0.0,
+            0.0, 1.0, 0.0
+        };
+        final double[] arrWithNegZero = {
+            1.0, 0.0, 0.0,
+            0.0, 1.0, -0.0
+        };
+        final AffineTransformMatrix2D a = AffineTransformMatrix2D.of(arrWithPosZero);
+        final AffineTransformMatrix2D b = AffineTransformMatrix2D.of(arrWithNegZero);
+        final AffineTransformMatrix2D c = AffineTransformMatrix2D.of(arrWithPosZero);
+        final AffineTransformMatrix2D d = AffineTransformMatrix2D.of(arrWithNegZero);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+        Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final AffineTransformMatrix2D a = AffineTransformMatrix2D.of(
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinatesTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinatesTest.java
index c6599a9..eb609d5 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinatesTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/PolarCoordinatesTest.java
@@ -254,6 +254,24 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final PolarCoordinates a = PolarCoordinates.of(0.0, -0.0);
+        final PolarCoordinates b = PolarCoordinates.of(-0.0, 0.0);
+        final PolarCoordinates c = PolarCoordinates.of(0.0, -0.0);
+        final PolarCoordinates d = PolarCoordinates.of(-0.0, 0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToCartesian() {
         // arrange
         final double sqrt2 = Math.sqrt(2);
diff --git a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/Vector2DTest.java b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/Vector2DTest.java
index 5912503..ba623be 100644
--- a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/Vector2DTest.java
+++ b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/Vector2DTest.java
@@ -919,6 +919,24 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final Vector2D a = Vector2D.of(0.0, 0.0);
+        final Vector2D b = Vector2D.of(-0.0, -0.0);
+        final Vector2D c = Vector2D.of(0.0, 0.0);
+        final Vector2D d = Vector2D.of(-0.0, -0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testToString() {
         // arrange
         final Vector2D v = Vector2D.of(1, 2);
diff --git a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/Point1STest.java b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/Point1STest.java
index e7c0284..f9772c1 100644
--- a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/Point1STest.java
+++ b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/Point1STest.java
@@ -209,6 +209,25 @@
     }
 
     @Test
+    public void testEqualsAndHashCode_signedZeroConsistency() {
+        // arrange
+        final Point1S a = Point1S.of(0.0);
+        final Point1S b = Point1S.of(-0.0);
+        final Point1S c = Point1S.of(0.0);
+        final Point1S d = Point1S.of(-0.0);
+
+        // act/assert
+        Assert.assertFalse(a.equals(b));
+        Assert.assertNotEquals(a.hashCode(), b.hashCode());
+
+        Assert.assertTrue(a.equals(c));
+        Assert.assertEquals(a.hashCode(), c.hashCode());
+
+        Assert.assertTrue(b.equals(d));
+        Assert.assertEquals(b.hashCode(), d.hashCode());
+    }
+
+    @Test
     public void testEq() {
         // arrange
         final DoublePrecisionContext highPrecision = new EpsilonDoublePrecisionContext(1e-10);
diff --git a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java
index a982560..6683be5 100644
--- a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java
+++ b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/twod/ConvexArea2STest.java
@@ -228,7 +228,7 @@
     @Test
     public void testFromBounds_triangle_small() {
         // arrange
-        final double azMin = 1.125 * PlaneAngleRadians.PI;
+        final double azMin = 1.12 * PlaneAngleRadians.PI;
         final double azMax = 1.375 * PlaneAngleRadians.PI;
         final double azMid = 0.5 * (azMin + azMax);
         final double polarTop = 0.1;
diff --git a/src/main/resources/checkstyle/checkstyle-suppressions.xml b/src/main/resources/checkstyle/checkstyle-suppressions.xml
index 092a279..5ae72a3 100644
--- a/src/main/resources/checkstyle/checkstyle-suppressions.xml
+++ b/src/main/resources/checkstyle/checkstyle-suppressions.xml
@@ -28,7 +28,7 @@
   <!-- allow Vector3D.linearCombination() methods -->
   <suppress checks="ParameterNumber" files=".*[/\\]threed[/\\]Vector3D" />
   <!-- allow internal, non-array QuaterionRotation.orthogonalRotationMatrixToQuaternion() method -->
-  <suppress checks="ParameterNumber" files=".*[/\\]threed/rotation[/\\]QuaternionRotation" />
+  <suppress checks="ParameterNumber" files=".*[/\\]threed[/\\]rotation[/\\]QuaternionRotation" />
   <!-- allow Vector2D.linearCombination() methods -->
   <suppress checks="ParameterNumber" files=".*[/\\]twod[/\\]Vector2D" />
   <!-- Prevent subclass error on generic package-private methods (checkstyle parsing issue?) -->