Guide des utilitaires mathématiques en goyave

Guide des utilitaires mathématiques en goyave

1. Vue d'ensemble

Dans cet article, nous verrons quelques opérations mathématiques utiles disponibles dans la bibliothèque Guava.

Il existe quatre classes d'utilitaires de mathématiques disponibles avec Guava:

  1. IntMath - opération sur les valeurs int

  2. LongMath - opérations sur des valeurs longues

  3. BigIntegerMath - opérations surBigIntegers

  4. DoubleMath - opérations sur des valeurs doubles

2. UtilitaireIntMath

IntMath est utilisé pour effectuer des opérations mathématiques sur des valeurs entières. Nous allons parcourir la liste des méthodes disponibles expliquant chacun de leurs comportements.

2.1. binomial(int n, int k)

Cette fonction calcule le coefficient binomial de n et k. Il s'assure que le résultat est dans la plage entière. Sinon, il donne lesInteger.MAX_VALUE. La réponse peut être obtenue en utilisant la formule 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)

Ceci calcule la valeur de la plus petite puissance de deux qui est supérieure ou égale à x. Le résultat n est tel que 2 ^ (n-1)

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

  assertEquals(32, result);
}

2.3. checkedAdd(int a, int b) et autres

Cette fonction calcule la somme des deux paramètres. Celui-ci fournit une vérification supplémentaire qui renvoieArithmeticException si le résultat déborde:

@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 a vérifié des méthodes pour trois autres opérateurs qui peuvent déborder:checkedMultiply,checkedPow, etcheckedSubtract.

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

Ceci est une division simple mais permet de définir un mode d'arrondi:

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

Calcule la valeur factorielle de n. i.e the product of the first n positive integers. Renvoie 1 si n = 0 et renvoieInteger.MAX_VALUE si le résultat ne rentre pas dans la plage int. Le résultat peut être obtenu par 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)

Renvoie la plus grande puissance de deux, dont le résultat est inférieur ou égal à x. Le résultat n est tel que 2 ^ n

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

    assertEquals(16, result);
}

2.7. gcd(int a, int b)

Cette fonction nous donne le plus grand commun diviseur de a et b:

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

2.8. isPowerOfTwo(int x)

Retourne si x est une puissance de deux ou pas. Renvoie true si la valeur est une puissance de deux et false sinon:

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

Cette fonction nous dira si le nombre passé est premier ou non:

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

    assertFalse(result);
}

2.10. log10(int x, RoundingMode mode)

Cette API calcule le logarithme en base 10 du nombre donné. Le résultat est arrondi en utilisant le mode d'arrondi fourni:

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

Renvoie le logarithme en base 2 du nombre donné. Le résultat est arrondi en utilisant le mode d'arrondi fourni:

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

Avec cette fonction, nous pouvons calculer la moyenne de deux valeurs:

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

    assertEquals(25, result);
}

2.13. mod(int x, int m)

Renvoie le reste de la division entière d'un nombre par l'autre:

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

2.14. pow(int b, int k)

Renvoie la valeur de b à la puissance de k:

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

    assertEquals(1296, result);
}

2.15. saturatedAdd(int a, int b) et autres

Une fonction de somme avec l'avantage de contrôler les débordements ou sous-débits en renvoyant respectivement la valeurInteger.MAX_VALUE ouInteger.MIN_VALUE quand elle se produit:

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

Il existe trois autres API saturées:saturatedMultiply,saturatedPow etsaturatedSubtract.

2.16. sqrt(int x, RoundingMode mode)

Retourne la racine carrée du nombre donné. Le résultat est arrondi en utilisant le mode d'arrondi fourni:

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

LongMath a des utilitaires pour les valeursLong. La plupart des opérations sont similaires à l'utilitaireIntMath, avec quelques exceptions décrites ici.

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

Retourne le x mod m. Le reste de la division entière de x par 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. UtilitaireBigIntegerMath

BigIntegerMath est utilisé pour effectuer des opérations mathématiques sur le typeBigInteger.

Cet utilitaire a des méthodes similaires auxIntMath.

5. Utilitaire DoubleMath

L'utilitaireDoubleMath est utilisé pour effectuer une opération sur des valeurs doubles.

Similaire à l'utilitaireBigInteger, le nombre d'opérations disponibles est limité et partage la similitude avec l'utilitaireIntMath. Nous allons lister quelques fonctions exceptionnelles disponibles uniquement pour cette classe d’utilitaires.

5.1. isMathematicalInteger(double x)

Retourne si x est un entier mathématique. Il vérifie si le nombre peut être représenté sous la forme d'un entier sans perte de données:

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

Calcule le logarithme en base 2 de x:

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

    assertEquals(2, result, 0);
}

6. Conclusion

Dans ce rapide tutoriel, nous avons exploré certaines fonctions utiles de l’utilitaire de mathématiques Guava.

Comme toujours, le code source peut être trouvéover on GitHub.