Guia de Utilitários Matemáticos em Goiaba

Guia de Utilitários Matemáticos em Goiaba

1. Visão geral

Neste artigo, veremos algumas operações matemáticas úteis disponíveis na Biblioteca Guava.

Existem quatro classes de utilitários matemáticos disponíveis no Guava:

  1. IntMath - operação em valores internos

  2. LongMath - operações em valores longos

  3. BigIntegerMath - operações emBigIntegers

  4. DoubleMath - operações em valores duplos

2. UtilidadeIntMath

IntMath é usado para realizar operações matemáticas em valores inteiros. Percorreremos a lista de métodos disponíveis explicando cada um de seus comportamentos.

2.1. binomial(int n, int k)

Esta função calcula o coeficiente binomial de n e k. Isso garante que o resultado esteja dentro do intervalo inteiro. Caso contrário, dáInteger.MAX_VALUE. A resposta pode ser derivada usando a fórmula 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)

Isso calcula o valor da menor potência de duas que é maior ou igual a x. O resultado n é tal que 2 ^ (n-1)

@Test
public void whenCeilPowOfTwoInt_shouldReturnResult() {
  int result = IntMath.ceilingPowerOfTwo(20);

  assertEquals(32, result);
}

2.3. checkedAdd(int a, int b)e outros

Esta função calcula a soma dos dois parâmetros. Este fornece uma verificação adicional que lançaArithmeticException se o resultado estourar:

@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 verificou métodos para três outros operadores que podem estourar:checkedMultiply,checkedPow,echeckedSubtract.

2.4. divide(int p, int q, RoundingMode mode)

Essa é uma divisão simples, mas permite definir um modo de arredondamento:

@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)

Calcula o valor fatorial de n. i.e the product of the first n positive integers. Retorna 1 se n = 0 e retornaInteger.MAX_VALUE se o resultado não se encaixa no intervalo interno. O resultado pode ser obtido por n x (n-1) x (n-2) x… .. x 2 x 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)

Retorna a maior potência de duas, das quais os resultados são menores ou iguais a x. O resultado n é tal que 2 ^ n

@Test
public void whenFloorPowerOfInt_shouldReturnValue() {
    int result = IntMath.floorPowerOfTwo(30);

    assertEquals(16, result);
}

2.7. gcd(int a, int b)

Essa função nos fornece o maior divisor comum de aeb:

@Test
public void whenGcdOfTwoInt_shouldReturnValue() {
    int result = IntMath.gcd(30, 40);
    assertEquals(10, result);
}

2.8. isPowerOfTwo(int x)

Retorna se x é uma potência de dois ou não. Retorna true se o valor for uma potência de dois e false caso contrário:

@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)

Esta função nos dirá se o número passado é primo ou não:

@Test
public void givenNonPrimeInt_whenIsPrime_shouldReturnFalse() {
    boolean result = IntMath.isPrime(20);

    assertFalse(result);
}

2.10. log10(int x, RoundingMode mode)

Essa API calcula o logaritmo da base 10 do número fornecido. O resultado é arredondado usando o modo de arredondamento fornecido:

@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)

Retorna o logaritmo de base 2 do número fornecido. O resultado é arredondado usando o modo de arredondamento fornecido:

@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)

Com esta função, podemos calcular a média de dois valores:

@Test
public void whenMeanTwoInt_shouldReturnTheResult() {
    int result = IntMath.mean(30, 20);

    assertEquals(25, result);
}

2.13. mod(int x, int m)

Retorna o restante da divisão inteira de um número pelo outro:

@Test
public void whenModTwoInt_shouldReturnTheResult() {
    int result = IntMath.mod(30, 4);
    assertEquals(2, result);
}

2.14. pow(int b, int k)

Retorna o valor de b para a potência de k:

@Test
public void whenPowTwoInt_shouldReturnTheResult() {
    int result = IntMath.pow(6, 4);

    assertEquals(1296, result);
}

2.15. saturatedAdd(int a, int b)e outros

Uma função de soma com o benefício de controlar quaisquer overflows ou underflows, retornando o valorInteger.MAX_VALUE ouInteger.MIN_VALUE, respectivamente, quando ocorrer:

@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);
}

Existem três outras APIs saturadas:saturatedMultiply,saturatedPowesaturatedSubtract.

2.16. sqrt(int x, RoundingMode mode)

Retorna a raiz quadrada do número fornecido. O resultado é arredondado usando o modo de arredondamento fornecido:

@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. UtilidadeLongMath

LongMath tem utilitários para valores deLong. A maioria das operações é semelhante ao utilitárioIntMath, com algumas exceções descritas aqui.

3.1. mod(long x, int m) emod(long x, long m)

Retorna o x mod m. O restante da divisão inteira de x por 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. UtilidadeBigIntegerMath

BigIntegerMath é usado para realizar operações matemáticas no tipoBigInteger.

Este utilitário tem alguns métodos semelhantes aoIntMath.

5. Utilitário DoubleMath

O utilitárioDoubleMath é usado para realizar uma operação em valores duplos.

Semelhante ao utilitárioBigInteger, o número de operações disponíveis é limitado e compartilha similaridade com o utilitárioIntMath. Vamos listar algumas funções excepcionais disponíveis apenas para esta classe de utilitário.

5.1. isMathematicalInteger(double x)

Retorna se x é um número inteiro matemático. Ele verifica se o número pode ser representado como um número inteiro sem perda de dados:

@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)

Calcula o logaritmo de base 2 de x:

@Test
public void whenLog2Double_shouldReturnResult() {
    double result = DoubleMath.log2(4);

    assertEquals(2, result, 0);
}

6. Conclusão

Neste tutorial rápido, exploramos algumas funções úteis do utilitário Guava maths.

Como sempre, o código-fonte pode ser encontradoover on GitHub.