This is an automated email from the ASF dual-hosted git repository. alexismanin pushed a commit to branch fix/geotiff-flaky-test in repository https://gitbox.apache.org/repos/asf/sis.git
commit 76febadda64437f612a05073f68fdfbf5688eb60 Author: Alexis Manin <[email protected]> AuthorDate: Wed May 20 17:15:11 2026 +0200 feat(Utilities): add support for numbers in approximate equality --- .../main/org/apache/sis/util/Utilities.java | 11 +++++++++++ .../main/org/apache/sis/util/internal/shared/Numerics.java | 6 +++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/Utilities.java b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/Utilities.java index 4587b71572..4cdf227ea3 100644 --- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/Utilities.java +++ b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/Utilities.java @@ -25,6 +25,7 @@ import java.util.Set; import java.util.Objects; import java.util.Optional; import org.apache.sis.util.collection.CheckedContainer; +import org.apache.sis.util.internal.shared.Numerics; /** @@ -204,6 +205,16 @@ public final class Utilities { } return true; } + + if (object1 instanceof Number && object2 instanceof Number) { + final Number n1 = (Number) object1; + final Number n2 = (Number) object2; + return (n1 == n2 || ( + (n1 instanceof Double || n1 instanceof Float || n2 instanceof Double || n2 instanceof Float) + && Numerics.epsilonEqual(n1.doubleValue(), n2.doubleValue(), mode) + )); + } + return Objects.deepEquals(object1, object2); } diff --git a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/Numerics.java b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/Numerics.java index 3a03b0fe2f..bd7b23c21b 100644 --- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/Numerics.java +++ b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/internal/shared/Numerics.java @@ -400,7 +400,11 @@ public final class Numerics { public static boolean epsilonEqual(final double v1, final double v2, final ComparisonMode mode) { if (mode.isApproximate()) { final double mg = max(abs(v1), abs(v2)); - if (mg != Double.POSITIVE_INFINITY) { + /* + * If one of the numbers to compare is not finite, it is not possible to compare them using an epsilon. + * In such cases, we must fall back to the standard equal to check if their bit representation is the same. + */ + if (Double.isFinite(mg)) { return epsilonEqual(v1, v2, COMPARISON_THRESHOLD * mg); } }
