1. Fonctions trigonométriques en Java

Lorsque nous avons étudié les nombres arrondis plus tôt, nous nous sommes familiarisés avec la Mathclasse et certaines de ses méthodes. Nous allons maintenant détailler cette classe.

Comme son nom l'indique, la Mathclasse contient des méthodes pour les opérations mathématiques les plus fréquemment utilisées par les programmeurs. Voici les plus intéressants :

Méthode Description
double sin(double d)
Renvoie le sinus de l'angle d, en radians
double cos(double d)
Renvoie le cosinus de l'angle d, en radians
double tan(double d)
Renvoie la tangente de l'angle d, en radians
double asin(double d)
Renvoie l'arc sinus
double acos(double d)
Renvoie l'arc cosinus
double atan(double d)
Renvoie l'arc tangente
double sinh(double d)
Renvoie le sinus hyperbolique
double cosh(double d)
Renvoie le cosinus hyperbolique
double tanh(double d)
Renvoie la tangente hyperbolique

Les méthodes , et prennent un angle exprimé en radians. Pour convertir un angle de degrés en radians et vice versa, la classe propose deux méthodes spéciales :Math.sin()Math.cos()Math.tan()Math

Méthode Description
double toRadians(double angdeg)
Convertit un angle de degrés en radians
double toDegrees(double angrad)
Convertit un angle de radians en degrés

Soit dit en passant, en plus des méthodes, la Mathclasse a également deux variables constantes (champs statiques de la classe) :

Constant Description
double Math.PI
La constante "Pi" est égale à3.141592653589793
double Math.E
La constante "E" est égale à2.718281828459045

Toutes ces fonctions peuvent vous être très utiles si vous décidez d'écrire vos propres jeux, de travailler avec des graphismes ou simplement de calculer la longueur d'un chemin sur une carte.

Par exemple, si vous souhaitez calculer sin(45°), voici comment procéder :

Math.sin( Math.toRadians(45) )

Voici un exemple :

public class Main
{
   public static int N = 10;

   public static void drawValue(double y)
   {
     int value = (int) (y * N) + N;
     for (int i = 0; i < 2 * N; i++)
     {
       char c = i == N ? '|': '.';
       if (i == value)
         c = '*';
       System.out.print(c);
     }
     System.out.println();
   }

   public static void main(String[] args)
   {
     for (int i = 0; i < 10 * N; i++)
     {
       double x = i * 1.0 / N;
       double y = Math.sin(x);
       drawValue(y);
     }
   }
}


2. Fonctions algébriques en Java

Dans la plupart des cas, les mathématiques du secondaire suffisent à un programmeur : même les sinus et les cosinus sont très rarement trouvés dans le code. Le plus souvent, ils sont nécessaires lorsque vous travaillez avec des jeux, des cartes ou des moteurs de jeu. 90% des programmeurs ne rencontrent jamais cela.

Mais en plus de la géométrie, les programmeurs doivent parfois utiliser des fonctions algébriques. Et, bien sûr, la Mathclasse contient les plus courantes :

Méthode Description
double sqrt(double a)
racine carrée dea
double cbrt(double a)
racine cubique dea
double pow(double a, double b)
exponentiation :ab
double exp(double a)
exponentielle (nombre d'Euler élevé à une puissance) :ea
double log(double a)
logarithme naturel de a:ln(a)
double log10(double a)
logarithme en base 10 de a:log10(a)
double log1p(double x)
logarithme naturel de x + 1:ln(x + 1)
double expm1(double x)
ex-1

Si vous voulez la racine carrée ou cubique d'un nombre, les méthodes sqrt(a)et cbrt(a)sont à votre service.

La racine carrée peut être calculée comme suit :

Math.sqrt(2)

Si vous voulez obtenir une racine d'une puissance supérieure, utilisez la méthode d'exponentiation : aà la puissance ¼est la quatrième racine, etc.

Math.pow(2, 0.25)

Pour les logarithmes et les exposants, il existe les méthodes log(a)(logarithme naturel) et exp(x)(exponentielle). Pour calculer le logarithme en base 10, nous avons log10(a).

Si vous voulez que le logarithme d'un nombre bsoit basé sur a, utilisez cette formule simple :loga(b) = ln(b) / ln(a)

Méthodes utiles

Si vous effectuez des calculs impliquant de très petites valeurs de x, les deux dernières fonctions — log1p()et expm1()— peuvent vous être utiles.

Lorsque vous ajoutez des variables très petites et très grandes double, vous constaterez souvent que les très petites valeurs sont simplement ignorées (rejetées) car insignifiantes. En fait, cela se produira si vous utilisez les méthodes log()et exp(). Pour résoudre ce problème, les programmeurs ont proposé des fonctions qui ne renvoient que la "petite partie significative"

Exemple:

Supposons que vous vouliez calculer le logarithme népérien de 1 + x, où xest . Vous ne pouvez pas simplement passer ce nombre à la méthode, car si vous ajoutez et , vous obtenez . est un si petit nombre qu'il sera complètement ignoré lorsque les nombres seront additionnés.10-20log()110-20110-20

Étant donné que les mathématiques impliquent souvent le calcul de log()nombres proches de 1, les programmeurs ont trouvé un moyen de contourner ce problème : au lieu de transmettre le nombre lui-même à la méthode, ne transmettez que sa différence par rapport à 1.



3. Minimum et maximum

Deux autres fonctions utiles sont min(a, b)et max(a, b). Comme vous l'avez probablement déjà deviné, le premier renvoie le minimum de deux nombres :

Math.min(a, b)

Et le second renvoie le maximum de deux nombres :

Math.max(a, b)

Pourquoi avons-nous besoin de ces fonctions quand on peut toujours écrire ifou même utiliser l'opérateur ternaire (a < b ? a: b)?

Tout dépend de la lisibilité du code. Parfois, votre code est surchargé d' ifinstructions et vous souhaitez utiliser une notation plus compacte. Comparons:

Code Description
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Utiliser une if-elseinstruction (la manière la plus longue de l'écrire)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Utilisation de l'opérateur ternaire Inconvénients :
- code volumineux
- les calculs sont effectués deux fois
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
C'est une excellente façon de l'écrire, mais c'est un peu redondant
int x = Math.min(x-5+y*20, x*x+y*y);
Juste ce qu'il faut 🙂

4. Minimum et maximum de plusieurs nombres

Il existe une autre excellente façon d'utiliser les méthodes min()et max().

Calculer le minimum (ou le maximum) de plusieurs nombres ou variables. Il est très pratique de faire des appels imbriqués à ces méthodes.

Voici comment trouver le minimum de 3 numéros :

Math.min(a, Math.min(b, c))

Et alors? C'est super pratique : calculez le minimum de deux nombres, puis retournez le minimum de ce nombre et du troisième nombre.

Le minimum de quatre nombres s'obtient de la même manière :

Math.min(a, Math.min(b, Math.min(с, d)))

Cela dit, on peut écrire cette formule un peu plus clairement :

Math.min(Math.min(a, b), Math.min(c, d))

Tout fonctionne de la même manière pour la max()méthode.

L'utilisation de l' if-elseopérateur ou de l'opérateur ternaire rendrait ces extraits de code un peu plus encombrants. Mais utiliser les méthodes min()et max()est tout simplement parfait.