Руководство по математическим утилитам в Гуаве
1. обзор
В этой статье мы увидим некоторые полезные математические операции, доступные в библиотеке Guava.
В Guava есть четыре класса математических утилит:
-
IntMath - операция над значениями типа int
-
LongMath - операции с длинными значениями
-
BigIntegerMath - операции сBigIntegers
-
DoubleMath - операции с двойными значениями
2. IntMath Утилита
IntMath используется для выполнения математических операций с целочисленными значениями. Мы рассмотрим список доступных методов, объясняя их поведение.
2.1. binomial(int n, int k)с
Эта функция вычисляет биномиальный коэффициент n и k. Он гарантирует, что результат находится в целочисленном диапазоне. В противном случае он даетInteger.MAX_VALUE. Ответ можно вывести с помощью формулы n / k (n-k):
@Test
public void whenBinomialOnTwoInt_shouldReturnResultIfUnderInt() {
int result = IntMath.binomial(6, 3);
assertEquals(20, result);
}
@Test
public void whenBinomialOnTwoInt_shouldReturnIntMaxIfOVerflowInt() {
int result = IntMath.binomial(Integer.MAX_VALUE, 3);
assertEquals(Integer.MAX_VALUE, result);
}
2.2. ceilingPowerOfTwo(int x)с
Это вычисляет значение наименьшей степени двух, которая больше или равна x. Результат n таков, что 2 ^ (n-1)
@Test
public void whenCeilPowOfTwoInt_shouldReturnResult() {
int result = IntMath.ceilingPowerOfTwo(20);
assertEquals(32, result);
}
2.3. checkedAdd(int a, int b) и другие
Эта функция вычисляет сумму двух параметров. Это обеспечивает дополнительную проверку, которая выдаетArithmeticException, если результат переполняется:
@Test
public void whenAddTwoInt_shouldReturnTheSumIfNotOverflow() {
int result = IntMath.checkedAdd(1, 2);
assertEquals(3, result);
}
@Test(expected = ArithmeticException.class)
public void whenAddTwoInt_shouldThrowArithmeticExceptionIfOverflow() {
IntMath.checkedAdd(Integer.MAX_VALUE, 100);
}
Guava проверил методы для трех других операторов, которые могут переполняться:checkedMultiply,checkedPow, иcheckedSubtract.
2.4. divide(int p, int q, RoundingMode mode)с
Это простое деление, но позволяет нам определить режим округления:
@Test
public void whenDivideTwoInt_shouldReturnTheResultForCeilingRounding() {
int result = IntMath.divide(10, 3, RoundingMode.CEILING);
assertEquals(4, result);
}
@Test(expected = ArithmeticException.class)
public void whenDivideTwoInt_shouldThrowArithmeticExIfRoundNotDefinedButNeeded() {
IntMath.divide(10, 3, RoundingMode.UNNECESSARY);
}
2.5. factorial(int n)с
Вычисляет факториальное значение n. i.e the product of the first n positive integers. Возвращает 1, если n = 0, и возвращаетInteger.MAX_VALUE, если результат не соответствует диапазону int. Результат может быть получен с помощью n x (n-1) x (n-2) x… .. х 2 х 1:
@Test
public void whenFactorialInt_shouldReturnTheResultIfInIntRange() {
int result = IntMath.factorial(5);
assertEquals(120, result);
}
@Test
public void whenFactorialInt_shouldReturnIntMaxIfNotInIntRange() {
int result = IntMath.factorial(Integer.MAX_VALUE);
assertEquals(Integer.MAX_VALUE, result);
}
2.6. floorPowerOfTwo(int x)с
Возвращает наибольшую степень двух, из которых результаты меньше или равны x. Результат n таков, что 2 ^ n
@Test
public void whenFloorPowerOfInt_shouldReturnValue() {
int result = IntMath.floorPowerOfTwo(30);
assertEquals(16, result);
}
2.7. gcd(int a, int b)с
Эта функция дает нам наибольший общий делитель a и b:
@Test
public void whenGcdOfTwoInt_shouldReturnValue() {
int result = IntMath.gcd(30, 40);
assertEquals(10, result);
}
2.8. isPowerOfTwo(int x)с
Возвращает, является ли x степенью двойки или нет. Возвращает true, если значение является степенью двойки, и false в противном случае:
@Test
public void givenIntOfPowerTwo_whenIsPowOfTwo_shouldReturnTrue() {
boolean result = IntMath.isPowerOfTwo(16);
assertTrue(result);
}
@Test
public void givenIntNotOfPowerTwo_whenIsPowOfTwo_shouldReturnFalse() {
boolean result = IntMath.isPowerOfTwo(20);
assertFalse(result);
}
2.9. isPrime(int n)с
Эта функция сообщит нам, является ли переданное число простым или нет:
@Test
public void givenNonPrimeInt_whenIsPrime_shouldReturnFalse() {
boolean result = IntMath.isPrime(20);
assertFalse(result);
}
2.10. log10(int x, RoundingMode mode)с
Этот API рассчитывает логарифм по основному 10 для данного числа. Результат округляется с использованием предоставленного режима округления:
@Test
public void whenLog10Int_shouldReturnTheResultForCeilingRounding() {
int result = IntMath.log10(30, RoundingMode.CEILING);
assertEquals(2, result);
}
@Test(expected = ArithmeticException.class)
public void whenLog10Int_shouldThrowArithmeticExIfRoundNotDefinedButNeeded() {
IntMath.log10(30, RoundingMode.UNNECESSARY);
}
2.11. log2(int x, RoundingMode mode)с
Возвращает логарифм по основанию-2 заданного числа. Результат округляется с использованием предоставленного режима округления:
@Test
public void whenLog2Int_shouldReturnTheResultForCeilingRounding() {
int result = IntMath.log2(30, RoundingMode.CEILING);
assertEquals(5, result);
}
@Test(expected = ArithmeticException.class)
public void whenLog2Int_shouldThrowArithmeticExIfRoundNotDefinedButNeeded() {
IntMath.log2(30, RoundingMode.UNNECESSARY);
}
2.12. mean(int x, int y)с
С помощью этой функции мы можем вычислить среднее из двух значений:
@Test
public void whenMeanTwoInt_shouldReturnTheResult() {
int result = IntMath.mean(30, 20);
assertEquals(25, result);
}
2.13. mod(int x, int m)с
Возвращает остаток от целочисленного деления одного числа на другое:
@Test
public void whenModTwoInt_shouldReturnTheResult() {
int result = IntMath.mod(30, 4);
assertEquals(2, result);
}
2.14. pow(int b, int k)с
Возвращает значение b в степень k:
@Test
public void whenPowTwoInt_shouldReturnTheResult() {
int result = IntMath.pow(6, 4);
assertEquals(1296, result);
}
2.15. saturatedAdd(int a, int b) и другие
Функция суммы, позволяющая контролировать любые переполнения или потери значимости путем возврата значенияInteger.MAX_VALUE илиInteger.MIN_VALUE соответственно, когда это происходит:
@Test:
public void whenSaturatedAddTwoInt_shouldReturnTheResult() {
int result = IntMath.saturatedAdd(6, 4);
assertEquals(10, result);
}
@Test
public void whenSaturatedAddTwoInt_shouldReturnIntMaxIfOverflow() {
int result = IntMath.saturatedAdd(Integer.MAX_VALUE, 1000);
assertEquals(Integer.MAX_VALUE, result);
}
Есть еще три насыщенных API:saturatedMultiply,saturatedPow иsaturatedSubtract.
2.16. sqrt(int x, RoundingMode mode)с
Возвращает квадратный корень из указанного числа. Результат округляется с использованием предоставленного режима округления:
@Test
public void whenSqrtInt_shouldReturnTheResultForCeilingRounding() {
int result = IntMath.sqrt(30, RoundingMode.CEILING);
assertEquals(6, result);
}
@Test(expected = ArithmeticException.class)
public void whenSqrtInt_shouldThrowArithmeticExIfRoundNotDefinedButNeded() {
IntMath.sqrt(30, RoundingMode.UNNECESSARY);
}
3. LongMath Утилита
LongMath имеет утилиты для значенийLong. Большинство операций аналогичны утилитеIntMath, но некоторые из них описаны здесь.
3.1. mod(long x, int m) иmod(long x, long m)
Возвращает х мод м. Остаток от целочисленного деления x на m:
@Test
public void whenModLongAndInt_shouldModThemAndReturnTheResult() {
int result = LongMath.mod(30L, 4);
assertEquals(2, result);
}
@Test
public void whenModTwoLongValues_shouldModThemAndReturnTheResult() {
long result = LongMath.mod(30L, 4L);
assertEquals(2L, result);
}
4. BigIntegerMath Утилита
BigIntegerMath используется для выполнения математических операций с типомBigInteger.
Эта утилита имеет несколько методов, похожих наIntMath.
5. Утилита DoubleMath
УтилитаDoubleMath используется для выполнения операции над значениями типа double.
Подобно утилитеBigInteger, количество доступных операций ограничено и имеет сходство с утилитойIntMath. Мы перечислим некоторые исключительные функции, доступные только для этого служебного класса.
5.1. isMathematicalInteger(double x)с
Возвращает, является ли x математическим целым числом. Он проверяет, может ли число быть представлено как целое число без потери данных:
@Test
public void givenInt_whenMathematicalDouble_shouldReturnTrue() {
boolean result = DoubleMath.isMathematicalInteger(5);
assertTrue(result);
}
@Test
public void givenDouble_whenMathematicalInt_shouldReturnFalse() {
boolean result = DoubleMath.isMathematicalInteger(5.2);
assertFalse(result);
}
5.2. log2(double x)с
Рассчитывает основание-2 логарифм х:
@Test
public void whenLog2Double_shouldReturnResult() {
double result = DoubleMath.log2(4);
assertEquals(2, result, 0);
}
6. Заключение
В этом быстром уроке мы рассмотрели некоторые полезные математические функции Guava.
Как всегда, исходный код можно найтиover on GitHub.