Loi de Poisson + explication de texte
Bonjour à tous,
Code demandé en 1995, la loi binomiale aussi nommée Loi de Poisson sur laquelle s'appuit la courbe de Laplace-Gauss du nom du mathématicien normand de l'ère napoléonienne qui déboucha sur l'école libre suite à la Révolution de 1789, peut s'écrire ainsi*:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <stdio.h>
#include <math.h>
long fact(int i)
{
long f;
if (i==0)
{
return 1;
}
else
{
f = fact(i - 1);
return i*f;
}
}
main ()
{
int n, k;
double e, p, q, r, t, x, y, z;
printf("entrez la valeur de k entier non nul positif\n");
scanf("%d", &k);
printf("entrez le nombre d'essais n entier non nul positif\n");
scanf("%d", &n);
x = fact(n);
y = fact(k);
z = fact(n-k);
r = x/(y*z);
printf("la combinaison n de k est : %lf\n", r);
x = n-1;
y = k-1;
z = x-y;
x = fact(x);
y = fact(y);
z = fact(z);
e = x/(y*z);
e = e/x;
p = pow(e, k);
printf("la probabilite de succes k de n est : %lf\n", p);
x = n-k;
y = 1-p;
q = pow(y, x);
r = r*p*q;
printf("le resultat de la loi binomiale est : %lf\n", r);
e = n*p;
printf("l'esperance est de : %lf\n", e);
t = sqrt(e*q);
printf("l'ecart type est de : %lf\n", t);
x = exp(-e);
y = pow (e,k);
z = x*y;
k = fact(k);
x = z/k;
printf("la loi de poisson est : %g\n", x);
} |
Évidemment, même en 2006, donc a fortiori de nos jours, un compilateur actuel retourne warning et erreurs. A quelques exceptions près comme pour toute règle. Pourquoi.
1- l'architecture Intel 8,16,32,64 ( ou même 4096 ou 8192 ) bits d'une part
2- les limitations de la conception du langage C, qui date d'un demi-siècle, imprévu pour de tels calculs demandant une telle précision
Cependant, il s'agit d'une loi mathématique utilisée dans toutes les industries, y compris financière, afin de déterminer les risques en production et les délais de maintenance, ouvrant la route au big data. Il existe donc un workaround ou solution de contournement*: l'assembleur ou ASM que je ne maîtrise pas suffisamment non par méconnaissance du langage mais de l'architecture du µ.
De ces faits, je le laisse tel quel d'autant que cela produit un résultat aussi aléatoire qu'un ordinateur quantique demandé pour les PKI.
Marsu
Limitations du langage ou du codage ?
Bonjour,
Il y a confusion entre possibilités d'un langage et l'usage d'une fonction inadéquate.
Par ailleurs, calculer une factorielle en récursif est une hérésie en performances comme en occupation sur la pile (c'est hélas souvent donné comme (contre) exemple pédagogique). Une simple récurrence (boucle) suffirait.
De plus, calculer les combinaisons à partir des factorielles n'est pas le plus efficace. n!/((n-i)! (i!)) = n.(n-1)... max(n-i,i) / min(n-i, i)! On peut même éviter le calcul de la factorielle en dénominateur en précalculant k = n / min(n-i, i) pour sauter dans la boucle n.(n-1)... max(n-i, i) les k.i, k.i - k, k.i - 2.k etc.
Outre le gain d'efficacité cela retarde l'arrivée assez rapide de l'overflow.
Salutations