/*
* 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.math3.util;
import java.util.Arrays;
import org.apache.commons.math3.RealFieldElement;
import org.apache.commons.math3.exception.MathArithmeticException;
import org.apache.commons.math3.exception.NotFiniteNumberException;
import org.apache.commons.math3.exception.NullArgumentException;
import org.apache.commons.math3.exception.util.Localizable;
import org.apache.commons.math3.exception.util.LocalizedFormats;
Miscellaneous utility functions.
See Also: - ArithmeticUtils
- Precision
- MathArrays
/**
* Miscellaneous utility functions.
*
* @see ArithmeticUtils
* @see Precision
* @see MathArrays
*
*/
public final class MathUtils {
\(2\pi\)
Since: 2.1
/**
* \(2\pi\)
* @since 2.1
*/
public static final double TWO_PI = 2 * FastMath.PI;
\(\pi^2\)
Since: 3.4
/**
* \(\pi^2\)
* @since 3.4
*/
public static final double PI_SQUARED = FastMath.PI * FastMath.PI;
Class contains only static methods.
/**
* Class contains only static methods.
*/
private MathUtils() {}
Returns an integer hash code representing the given double value.
Params: - value – the value to be hashed
Returns: the hash code
/**
* Returns an integer hash code representing the given double value.
*
* @param value the value to be hashed
* @return the hash code
*/
public static int hash(double value) {
return new Double(value).hashCode();
}
Returns true
if the values are equal according to semantics of Double.equals(Object)
. Params: - x – Value
- y – Value
Returns: new Double(x).equals(new Double(y))
/**
* Returns {@code true} if the values are equal according to semantics of
* {@link Double#equals(Object)}.
*
* @param x Value
* @param y Value
* @return {@code new Double(x).equals(new Double(y))}
*/
public static boolean equals(double x, double y) {
return new Double(x).equals(new Double(y));
}
Returns an integer hash code representing the given double array.
Params: - value – the value to be hashed (may be null)
Returns: the hash code Since: 1.2
/**
* Returns an integer hash code representing the given double array.
*
* @param value the value to be hashed (may be null)
* @return the hash code
* @since 1.2
*/
public static int hash(double[] value) {
return Arrays.hashCode(value);
}
Normalize an angle in a 2π wide interval around a center value.
This method has three main uses:
- normalize an angle between 0 and 2π:
a = MathUtils.normalizeAngle(a, FastMath.PI);
- normalize an angle between -π and +π
a = MathUtils.normalizeAngle(a, 0.0);
- compute the angle between two defining angular positions:
angle = MathUtils.normalizeAngle(end, start) - start;
Note that due to numerical accuracy and since π cannot be represented
exactly, the result interval is closed, it cannot be half-closed
as would be more satisfactory in a purely mathematical view.
Params: - a – angle to normalize
- center – center of the desired 2π interval for the result
Returns: a-2kπ with integer k and center-π <= a-2kπ <= center+π Since: 1.2
/**
* Normalize an angle in a 2π wide interval around a center value.
* <p>This method has three main uses:</p>
* <ul>
* <li>normalize an angle between 0 and 2π:<br/>
* {@code a = MathUtils.normalizeAngle(a, FastMath.PI);}</li>
* <li>normalize an angle between -π and +π<br/>
* {@code a = MathUtils.normalizeAngle(a, 0.0);}</li>
* <li>compute the angle between two defining angular positions:<br>
* {@code angle = MathUtils.normalizeAngle(end, start) - start;}</li>
* </ul>
* <p>Note that due to numerical accuracy and since π cannot be represented
* exactly, the result interval is <em>closed</em>, it cannot be half-closed
* as would be more satisfactory in a purely mathematical view.</p>
* @param a angle to normalize
* @param center center of the desired 2π interval for the result
* @return a-2kπ with integer k and center-π <= a-2kπ <= center+π
* @since 1.2
*/
public static double normalizeAngle(double a, double center) {
return a - TWO_PI * FastMath.floor((a + FastMath.PI - center) / TWO_PI);
}
Find the maximum of two field elements.
Params: - e1 – first element
- e2 – second element
Type parameters: - <T> – the type of the field elements
Returns: max(a1, e2) Since: 3.6
/** Find the maximum of two field elements.
* @param <T> the type of the field elements
* @param e1 first element
* @param e2 second element
* @return max(a1, e2)
* @since 3.6
*/
public static <T extends RealFieldElement<T>> T max(final T e1, final T e2) {
return e1.subtract(e2).getReal() >= 0 ? e1 : e2;
}
Find the minimum of two field elements.
Params: - e1 – first element
- e2 – second element
Type parameters: - <T> – the type of the field elements
Returns: min(a1, e2) Since: 3.6
/** Find the minimum of two field elements.
* @param <T> the type of the field elements
* @param e1 first element
* @param e2 second element
* @return min(a1, e2)
* @since 3.6
*/
public static <T extends RealFieldElement<T>> T min(final T e1, final T e2) {
return e1.subtract(e2).getReal() >= 0 ? e2 : e1;
}
Reduce |a - offset|
to the primary interval [0, |period|)
.
Specifically, the value returned is
a - |period| * floor((a - offset) / |period|) - offset
.
If any of the parameters are NaN
or infinite, the result is NaN
.
Params: - a – Value to reduce.
- period – Period.
- offset – Value that will be mapped to
0
.
Returns: the value, within the interval [0 |period|)
, that corresponds to a
.
/**
* <p>Reduce {@code |a - offset|} to the primary interval
* {@code [0, |period|)}.</p>
*
* <p>Specifically, the value returned is <br/>
* {@code a - |period| * floor((a - offset) / |period|) - offset}.</p>
*
* <p>If any of the parameters are {@code NaN} or infinite, the result is
* {@code NaN}.</p>
*
* @param a Value to reduce.
* @param period Period.
* @param offset Value that will be mapped to {@code 0}.
* @return the value, within the interval {@code [0 |period|)},
* that corresponds to {@code a}.
*/
public static double reduce(double a,
double period,
double offset) {
final double p = FastMath.abs(period);
return a - p * FastMath.floor((a - offset) / p) - offset;
}
Returns the first argument with the sign of the second argument.
Params: - magnitude – Magnitude of the returned value.
- sign – Sign of the returned value.
Throws: - MathArithmeticException – if
magnitude == Byte.MIN_VALUE
and sign >= 0
.
Returns: a value with magnitude equal to magnitude
and with the same sign as the sign
argument.
/**
* Returns the first argument with the sign of the second argument.
*
* @param magnitude Magnitude of the returned value.
* @param sign Sign of the returned value.
* @return a value with magnitude equal to {@code magnitude} and with the
* same sign as the {@code sign} argument.
* @throws MathArithmeticException if {@code magnitude == Byte.MIN_VALUE}
* and {@code sign >= 0}.
*/
public static byte copySign(byte magnitude, byte sign)
throws MathArithmeticException {
if ((magnitude >= 0 && sign >= 0) ||
(magnitude < 0 && sign < 0)) { // Sign is OK.
return magnitude;
} else if (sign >= 0 &&
magnitude == Byte.MIN_VALUE) {
throw new MathArithmeticException(LocalizedFormats.OVERFLOW);
} else {
return (byte) -magnitude; // Flip sign.
}
}
Returns the first argument with the sign of the second argument.
Params: - magnitude – Magnitude of the returned value.
- sign – Sign of the returned value.
Throws: - MathArithmeticException – if
magnitude == Short.MIN_VALUE
and sign >= 0
.
Returns: a value with magnitude equal to magnitude
and with the same sign as the sign
argument.
/**
* Returns the first argument with the sign of the second argument.
*
* @param magnitude Magnitude of the returned value.
* @param sign Sign of the returned value.
* @return a value with magnitude equal to {@code magnitude} and with the
* same sign as the {@code sign} argument.
* @throws MathArithmeticException if {@code magnitude == Short.MIN_VALUE}
* and {@code sign >= 0}.
*/
public static short copySign(short magnitude, short sign)
throws MathArithmeticException {
if ((magnitude >= 0 && sign >= 0) ||
(magnitude < 0 && sign < 0)) { // Sign is OK.
return magnitude;
} else if (sign >= 0 &&
magnitude == Short.MIN_VALUE) {
throw new MathArithmeticException(LocalizedFormats.OVERFLOW);
} else {
return (short) -magnitude; // Flip sign.
}
}
Returns the first argument with the sign of the second argument.
Params: - magnitude – Magnitude of the returned value.
- sign – Sign of the returned value.
Throws: - MathArithmeticException – if
magnitude == Integer.MIN_VALUE
and sign >= 0
.
Returns: a value with magnitude equal to magnitude
and with the same sign as the sign
argument.
/**
* Returns the first argument with the sign of the second argument.
*
* @param magnitude Magnitude of the returned value.
* @param sign Sign of the returned value.
* @return a value with magnitude equal to {@code magnitude} and with the
* same sign as the {@code sign} argument.
* @throws MathArithmeticException if {@code magnitude == Integer.MIN_VALUE}
* and {@code sign >= 0}.
*/
public static int copySign(int magnitude, int sign)
throws MathArithmeticException {
if ((magnitude >= 0 && sign >= 0) ||
(magnitude < 0 && sign < 0)) { // Sign is OK.
return magnitude;
} else if (sign >= 0 &&
magnitude == Integer.MIN_VALUE) {
throw new MathArithmeticException(LocalizedFormats.OVERFLOW);
} else {
return -magnitude; // Flip sign.
}
}
Returns the first argument with the sign of the second argument.
Params: - magnitude – Magnitude of the returned value.
- sign – Sign of the returned value.
Throws: - MathArithmeticException – if
magnitude == Long.MIN_VALUE
and sign >= 0
.
Returns: a value with magnitude equal to magnitude
and with the same sign as the sign
argument.
/**
* Returns the first argument with the sign of the second argument.
*
* @param magnitude Magnitude of the returned value.
* @param sign Sign of the returned value.
* @return a value with magnitude equal to {@code magnitude} and with the
* same sign as the {@code sign} argument.
* @throws MathArithmeticException if {@code magnitude == Long.MIN_VALUE}
* and {@code sign >= 0}.
*/
public static long copySign(long magnitude, long sign)
throws MathArithmeticException {
if ((magnitude >= 0 && sign >= 0) ||
(magnitude < 0 && sign < 0)) { // Sign is OK.
return magnitude;
} else if (sign >= 0 &&
magnitude == Long.MIN_VALUE) {
throw new MathArithmeticException(LocalizedFormats.OVERFLOW);
} else {
return -magnitude; // Flip sign.
}
}
Check that the argument is a real number.
Params: - x – Argument.
Throws: - NotFiniteNumberException – if
x
is not a finite real number.
/**
* Check that the argument is a real number.
*
* @param x Argument.
* @throws NotFiniteNumberException if {@code x} is not a
* finite real number.
*/
public static void checkFinite(final double x)
throws NotFiniteNumberException {
if (Double.isInfinite(x) || Double.isNaN(x)) {
throw new NotFiniteNumberException(x);
}
}
Check that all the elements are real numbers.
Params: - val – Arguments.
Throws: - NotFiniteNumberException – if any values of the array is not a
finite real number.
/**
* Check that all the elements are real numbers.
*
* @param val Arguments.
* @throws NotFiniteNumberException if any values of the array is not a
* finite real number.
*/
public static void checkFinite(final double[] val)
throws NotFiniteNumberException {
for (int i = 0; i < val.length; i++) {
final double x = val[i];
if (Double.isInfinite(x) || Double.isNaN(x)) {
throw new NotFiniteNumberException(LocalizedFormats.ARRAY_ELEMENT, x, i);
}
}
}
Checks that an object is not null.
Params: - o – Object to be checked.
- pattern – Message pattern.
- args – Arguments to replace the placeholders in
pattern
.
Throws: - NullArgumentException – if
o
is null
.
/**
* Checks that an object is not null.
*
* @param o Object to be checked.
* @param pattern Message pattern.
* @param args Arguments to replace the placeholders in {@code pattern}.
* @throws NullArgumentException if {@code o} is {@code null}.
*/
public static void checkNotNull(Object o,
Localizable pattern,
Object ... args)
throws NullArgumentException {
if (o == null) {
throw new NullArgumentException(pattern, args);
}
}
Checks that an object is not null.
Params: - o – Object to be checked.
Throws: - NullArgumentException – if
o
is null
.
/**
* Checks that an object is not null.
*
* @param o Object to be checked.
* @throws NullArgumentException if {@code o} is {@code null}.
*/
public static void checkNotNull(Object o)
throws NullArgumentException {
if (o == null) {
throw new NullArgumentException();
}
}
}