Double boucle : plutôt que tester un milliard de fois si i est une puissance de 10,
j'utilise des intervalles en progression géométrique de raison 10;
Simplification de la formule de a en fonction de i : le multiplicateur B/(B-1)
est arrangé en (D+1)/D = 1 + 1/D, un peu plus simple ; en outre, la multiplication a *= (1+1/D ) peut être remplacée par une addition : a += a/D ...
La version additive tourne en 1mn 34.6s, et la multiplicative en 1mn 51.25s.
Les résultats ne sont pas très bons : la boucle finale tourne 900 millions de fois
pour rien (la 9ième valeur de a est identique à la précédente ; l'incrément devient beaucoup trop petit). Il faut donc utiliser des types plus longs pour les nombres obtenus.
Autre amélioration possible : le calcul direct du dénominateur D en fonction de i
peut être remplacé par un calcul itératif : on a un polynôme de degré 2 : P(X)= 4 * X2 -1, et on utilise la méthode des différences finies :
P(X+1) - (P(X) = 8 X + 4 = Q(X)
Le terme constant -1 de D a disparu de la boucle (pour se cacher dans l'initialisation).
On peut appliquer la même méthode à Q :
R(X) = Q(X+1) - Q(X) = 8
La différence théorique entre les sommes/produits partiels et la limite peut être évaluée à l'aide d'une intégrale : \int_N^{+\inf} dx/P(x)
# Optimisations
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Je veux bien que JavaScript soit optimisé, mais quand même !.... Évalué à 3.
Bonjour,
J'ai fait quelques essais ... en Perl (oui, c'est lent ;/) :
my $n = 9;
my $a = 2.0;
my $min = 1;
for (my $b=0 ; $b < $n ; $b++) {
my $max = 10 * $min;
for (my $i = $min; $i< $max; $i++) {
$a += $a/(4*$i*$i - 1.);
}
$min = $max;
print $b+1, " :\t", $a, "\n";
}
Double boucle : plutôt que tester un milliard de fois si i est une puissance de 10,
j'utilise des intervalles en progression géométrique de raison 10;
Simplification de la formule de a en fonction de i : le multiplicateur B/(B-1)
est arrangé en (D+1)/D = 1 + 1/D, un peu plus simple ; en outre, la multiplication a *= (1+1/D ) peut être remplacée par une addition : a += a/D ...
La version additive tourne en 1mn 34.6s, et la multiplicative en 1mn 51.25s.
Les résultats ne sont pas très bons : la boucle finale tourne 900 millions de fois
pour rien (la 9ième valeur de a est identique à la précédente ; l'incrément devient beaucoup trop petit). Il faut donc utiliser des types plus longs pour les nombres obtenus.
Autre amélioration possible : le calcul direct du dénominateur D en fonction de i
peut être remplacé par un calcul itératif : on a un polynôme de degré 2 : P(X)= 4 * X2 -1, et on utilise la méthode des différences finies :
P(X+1) - (P(X) = 8 X + 4 = Q(X)
Le terme constant -1 de D a disparu de la boucle (pour se cacher dans l'initialisation).
On peut appliquer la même méthode à Q :
R(X) = Q(X+1) - Q(X) = 8
La différence théorique entre les sommes/produits partiels et la limite peut être évaluée à l'aide d'une intégrale : \int_N^{+\inf} dx/P(x)