/** * Copyright (C) 2019 Adrien Hopkins * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package org.unitConverter.math; /** * A class that contains methods to compare float and double values. * * @author Adrien Hopkins * @since 2019-03-18 */ public final class DecimalComparison { /** * The value used for double comparison. If two double values are within this value multiplied by the larger value, * they are considered equal. * * @since 2019-03-18 */ public static final double DOUBLE_EPSILON = 1.0e-15; /** * The value used for float comparison. If two float values are within this value multiplied by the larger value, * they are considered equal. * * @since 2019-03-18 */ public static final float FLOAT_EPSILON = 1.0e-6f; /** * Tests for equality of double values using {@link #DOUBLE_EPSILON}. * * @param a * first value to test * @param b * second value to test * @return whether they are equal * @since 2019-03-18 */ public static final boolean equals(final double a, final double b) { return DecimalComparison.equals(a, b, DOUBLE_EPSILON); } /** * Tests for double equality using a custom epsilon value. * * @param a * first value to test * @param b * second value to test * @param epsilon * allowed difference * @return whether they are equal * @since 2019-03-18 */ public static final boolean equals(final double a, final double b, final double epsilon) { return Math.abs(a - b) <= epsilon * Math.max(Math.abs(a), Math.abs(b)); } /** * Tests for equality of float values using {@link #FLOAT_EPSILON}. * * @param a * first value to test * @param b * second value to test * @return whether they are equal * @since 2019-03-18 */ public static final boolean equals(final float a, final float b) { return DecimalComparison.equals(a, b, FLOAT_EPSILON); } /** * Tests for float equality using a custom epsilon value. * * @param a * first value to test * @param b * second value to test * @param epsilon * allowed difference * @return whether they are equal * @since 2019-03-18 */ public static final boolean equals(final float a, final float b, final float epsilon) { return Math.abs(a - b) <= epsilon * Math.max(Math.abs(a), Math.abs(b)); } // You may NOT get any DecimalComparison instances private DecimalComparison() { throw new AssertionError(); } }