eu.stratosphere.pact.runtime.util.MathUtils Maven / Gradle / Ivy
/***********************************************************************************************************************
* Copyright (C) 2010-2013 by the Stratosphere project (http://stratosphere.eu)
*
* Licensed 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 eu.stratosphere.pact.runtime.util;
/**
* Collection of simple mathematical routines.
*
*/
public final class MathUtils
{
/**
* Computes the logarithm of the given value to the base of 2, rounded down. It corresponds to the
* position of the highest non-zero bit. The position is counted, starting with 0 from the least
* significant bit to the most significant bit. For example, log2floor(16) = 4
, and
* log2floor(10) = 3
.
*
* @param value The value to compute the logarithm for.
* @return The logarithm (rounded down) to the base of 2.
* @throws ArithmeticException Thrown, if the given value is zero.
*/
public static final int log2floor(int value) throws ArithmeticException
{
if (value == 0) {
throw new ArithmeticException("Logarithm of zero is undefined.");
}
int log = 0;
while ((value = value >>> 1) != 0) {
log++;
}
return log;
}
/**
* Computes the logarithm of the given value to the base of 2. This method throws an error,
* if the given argument is not a power of 2.
*
* @param value The value to compute the logarithm for.
* @return The logarithm to the base of 2.
* @throws ArithmeticException Thrown, if the given value is zero.
* @throws IllegalArgumentException Thrown, if the given value is not a power of two.
*/
public static final int log2strict(int value) throws ArithmeticException, IllegalArgumentException
{
if (value == 0) {
throw new ArithmeticException("Logarithm of zero is undefined.");
}
if ((value & (value - 1)) != 0) {
throw new IllegalArgumentException("The given value " + value + " is not a power of two.");
}
int log = 0;
while ((value = value >>> 1) != 0) {
log++;
}
return log;
}
/**
* Decrements the given number down to the closest power of two. If the argument is a
* power of two, it remains unchanged.
*
* @param value The value to round down.
* @return The closest value that is a power of to and less or equal than the given value.
*/
public static final int roundDownToPowerOf2(int value)
{
return Integer.highestOneBit(value);
}
/**
* Casts the given value to a 32 bit integer, if it can be safely done. If the cast would change the numeric
* value, this method raises an exception.
*
* This method is a protection in places where one expects to be able to safely case, but where unexpected
* situations could make the cast unsafe and would cause hidden problems that are hard to track down.
*
* @param value The value to be cast to an integer.
* @return The given value as an integer.
*/
public static final int checkedDownCast(long value) {
if (value > Integer.MAX_VALUE) {
throw new IllegalArgumentException("Cannot downcast long value " + value + " to integer.");
}
return (int) value;
}
// ============================================================================================
/**
* Prevent Instantiation through private constructor.
*/
private MathUtils() {}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy