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:
-
IntMath - operação em valores internos
-
LongMath - operações em valores longos
-
BigIntegerMath - operações emBigIntegers
-
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.