Руководство по математическим утилитам в Гуаве

Руководство по математическим утилитам в Гуаве

1. обзор

В этой статье мы увидим некоторые полезные математические операции, доступные в библиотеке Guava.

В Guava есть четыре класса математических утилит:

  1. IntMath - операция над значениями типа int

  2. LongMath - операции с длинными значениями

  3. BigIntegerMath - операции сBigIntegers

  4. 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.