Voilà un sujet bien peu traité dans les tutoriaux de programmation. En effet, la plupart du temps, les auteurs de ces tutoriaux se contentent de donner une liste de fonctions sans rentrer dans les détails, et laissent le lecteur se débrouiller seul.
Pourtant, les fonctions mathématiques sont très utilisées en programmation. La fonction "Reste" peut ainsi servir pour trouver les coordonnées (x ; y) du Nème pixel du image, la racine carrée la distance entre deux pixels de cette image via le fameux théorème de pythagore, tandis que le logarithme permet de convertir un nombre en chaine de caractère...
« Maths, Informatique, Jeux » se devait d'expliquer ces fonctions et de donner un moyen de les "fabriquer" soi-même. C'est ce qui a été fait sur cette page...
La fonction SGN(x) retourne "le signe" de x, c'est à dire -1 si il est strictement négatif, 0 si x est nul et +1 si il est positif. Quant à ABS(x) elle retourne tout simplement la valeur absolue de x (x si x est positif et -x si x est négatif).
Est-il nécessaire de vous donner le code source ? C'est à la portée d'un débutant : il suffit de se servir des conditions.
Elles sont très utilisées, alors je ne vous citerai pas d'exemples particuliers, vous en retrouverez sur cette page ou ailleurs sur notre site comme par exemple sur la page programmation d'instructions graphiques ou lecture d'un mot.
Les fonctions d'arrondi sont elles aussi très utilisées. Comme leur nom l'indique, elle retourne l'arrondi d'un nombre. Il y en a trois principales :
Lorsque l'on parle d'arrondir un nombre, on a intuitivement l'idée "d'enlever les virgules" de ce nombre. Cependant en terme de programmation, cela se révèle plus difficile. De manière simple on pourrait faire une boucle qui rechercherai l'entier le plus proche de x mais cela prendrait du temps pour les grands nombres.
Pour fabriquer les fonctions d'arrondis, il faut repenser à ce qui est dit dans Le codage des informations : le codage du type "nombre décimal" est différent de celui du type "nombre entier". L'arrondi se voit alors comme une conversion d'un type "nombre décimal" en un type "nombre entier". Mais pour effectuer cette opération, il faut connaitre comment sont codés exactement ces types, donc je ne le ferais pas car je ne connait pas leur codage en javascript (d'ailleurs on ne peut pas choisir le type d'une donnée en javascript).
Heuresement, chaque langage a en général des fonctions d'arrondis intégrés dans ses fonctions standards (voir plus loin "Dans quelques langages"), donc vous n'aurez pas besoin de les créer.
Je pense que vous voyez tout de suite leur intérêt. Citons tout de même un exemple : je vous laisse vous convaincre de l'équivalence suivante.
Dans l'ensemble on définit la division Euclidienne ainsi :
« Soient et deux entiers (), alors il existe deux entiers uniques et tels que et . »
Cette écriture montre qu'on soustrait fois le nombre à l'entier et qu'à la fin il reste un nombre qui est le reste recherché (on peut d'ailleurs retenir cette première
méthode pour la programmation de notre fonction reste(a,b)).
Maintenant, en programmation, on utilise la fonction reste(a,b) dans . Pour la définir, on se sert des valeurs absolues pour comparer et :
« Soient et deux entiers (), alors il existe deux entiers et tels que et . »
On remarque que alors que reste(a,b) = SGN(a) × reste(|a|,|b|) (SNG(a) retourne le signe de a, cette fonction a été citée plus haut). Si on a trouvé un algorithme pour calculer le reste de deux entiers naturels (ce qui a été plus ou moins expliqué dans le premier paragraphe), on a alors du même coup un algorithme pour calculer le reste de deux entiers relatifs grâce à l'égalité que l'on vient de trouver.
function reste(a,b)
{
/* reste(a,b) pour |Z */
if(a<0||b<0)return SGN(a) * reste(Math.abs(a),Math.abs(b));
/* reste (a,b) pour |N */
while(!(a<b))a-=b;// on soustrait plusieurs fois b de a
return a;// à la fin a<b, le nombre a est devenu le reste.
}
Maintenant il y a une deuxième méthode pour programmer reste(a,b) pour qui évite de faire une boucle. D'abord, on montre que q est l'arrondi par défaut de a/b :
a = bq + r et r < b | a = bq + r et r ≥ 0 a < bq + b | a ≥ bq a < (q + 1)b | q ≤ a/b a/b < q + 1 | a/b - 1 < q | Et finalement : a/b - 1 < q ≤ a/b
function reste(a,b)
{
if(a<0||b<0)return SGN(a) * reste(Math.abs(a),Math.abs(b));
return a - b * Math.floor(a/b);
}
Reprenons l'exemple cité dans l'introduction : on désire connaitre les coordonnées du Nème pixel d'une image de dimensions Lx × Ly. Ces coordonnées sont (reste(N,Lx) ; arrondi_par_defaut(N/Lx)).
La fonction factorielle(n) retourne la factorielle de n, c'est à dire le produit (noté n!) des n premiers entiers : 1 × 2 × 3 × ... × n. Cette fonction utilisée en combinatoire, correspond au nombre de permutations de n objets, c'est à dire de manière différente de les ordonner. Lorsque n = 0, il n'y a qu'une seule manière de ranger ces objets donc 0! = 1.
Bien qu'elle soit souvent présente dans les tutoriaux de programmation pour illustrer les fonctions récursives (qui s'appellent elles même), je ne crois pas qu'elle soit énormément utilisée en programmation.
Il y a deux approches possibles : "la boucle" et "la fonction récursive". Je vous laisse les comparer. Vous pouvez rentrer des nombres entier de 0 à 170, au delà, les fonctions retourne "infinity". Et pour la fonction récursive elle provoque une erreur pour un n trop élevé car elle s'est appelée trop de fois (n'essayez pas sinon vous aurez à réactualiser la page pour que les script fonctionnent).
/* Boucle de calcul */
function fact(n)
{
for(a=1,f=1;a<n+1;f*=a,a++);
return f;
}
/* Fonction récursive */
function fact(n)
{
if(n>0)return n*fact(n-1); else return 1;
}
Comme je l'ai dit plus haut, je n'en ai pas eu souvent besoin. Elle sert en combinatoire pour calculer le nombre de permutations, d'arrangements et de combinaisons. C'est d'ailleurs grâce ces dernières, nécessaires pour le calcul du binôme de Newton, que je me suis servi de la fonction factorielle.
Ce que j'ai dit à propos de l'utilisation de la fonction semble se confirmer puisqu'il ne parait pas y avoir beaucoup de langages qui l'inclussent dans leurs fonctions standards. Je n'ai rien trouvé dans l'aide du QBASIC, rien non plus avec mon compilateur C et je n'ai pas vu de tutorial sur l'objet Math du javascript qui en parle.
La fonction puissance(x,y) retourne le nombre décimal x élevé à la puissance y. Si elle est relativement facile à programmer lorsque y est un nombre entier, on se heurte à quelques difficultés lorsque ce n'est pas le cas. Je donnerai donc les explications en même temps que la programmation pour permettre de comprendre la fonction pas à pas. Cette approche est un bon moyen pour étudier «l'analyse descendante » (voir partie structure d'un programme).
Cependant, pour éviter de charger la page et à cause du fait qu'il faille s'y connaitre un peu en maths pour comprendre la partie programmation, j'ai placé la partie programmation sur une autre page.
Comme cité dans l'intro, elle peut être utilisée pour calculer la distance entre deux points. Pour les deux points A(x_A ; y_A) et B(x_B ; y_B), on a :
AB=puissance(puissance(x_B-x_A,2)+puissance(y_B-y_A,2),.5)