blob: f8b047e59e4a71b5df89b8f3613f0e201c5cc03b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.geometry.core.precision;
import java.util.Comparator;
/** Class encapsulating the concept of comparison operations for doubles.
*/
public abstract class DoublePrecisionContext implements Comparator<Double> {
/** Return true if the given values are considered equal to each other.
* @param a first value
* @param b second value
* @return true if the given values are considered equal
*/
public boolean eq(final double a, final double b) {
return compare(a, b) == 0;
}
/** Return true if the given value is considered equal to zero. This is
* equivalent {@code context.eq(n, 0.0)} but with a more explicit
* method name.
* @param n the number to compare to zero
* @return true if the argument is considered equal to zero.
*/
public boolean eqZero(final double n) {
return eq(n, 0.0);
}
/**
* Return true if the first argument is strictly less than the second.
* @param a first value
* @param b second value
* @return true if {@code a < b}
*/
public boolean lt(final double a, final double b) {
return compare(a, b) < 0;
}
/**
* Return true if the first argument is less than or equal to the second.
* @param a first value
* @param b second value
* @return true if {@code a <= b}
*/
public boolean lte(final double a, final double b) {
return compare(a, b) <= 0;
}
/**
* Return true if the first argument is strictly greater than the second.
* @param a first value
* @param b second value
* @return true if {@code a > b}
*/
public boolean gt(final double a, final double b) {
return compare(a, b) > 0;
}
/**
* Return true if the first argument is greater than or equal to the second.
* @param a first value
* @param b second value
* @return true if {@code a >= b}
*/
public boolean gte(final double a, final double b) {
return compare(a, b) >= 0;
}
/** Return the sign of the argument: 0 if the value is considered equal to
* zero, -1 if less than 0, and +1 if greater than 0.
* @param a number to determine the sign of
* @return 0 if the number is considered equal to 0, -1 if less than
* 0, and +1 if greater than 0
*/
public int sign(final double a) {
final int cmp = compare(a, 0.0);
if (cmp < 0) {
return -1;
} else if (cmp > 0) {
return 1;
}
return 0;
}
/** {@inheritDoc} */
@Override
public int compare(final Double a, final Double b) {
return compare(a.doubleValue(), b.doubleValue());
}
/** Compare two double values. The returned value is
* <ul>
* <li>
* {@code 0} if the arguments are considered equal,
* </li>
* <li>
* {@code -1} if {@code a < b},
* </li>
* <li>
* {@code +1} if {@code a > b} or if either value is NaN.
* </li>
* </ul>
*
* @param a first value
* @param b second value
* @return {@code 0} if the values are considered equal, {@code -1} if the
* first is smaller than the second, {@code 1} is the first is larger
* than the second or either value is NaN.
*/
public abstract int compare(double a, double b);
/** Get the largest positive double value that is still considered equal
* to zero by this instance.
* @return the largest positive double value still considered equal to zero
*/
public abstract double getMaxZero();
}