FIBONACCI À L'INFINI...

cs_sergejb Messages postés 20 Date d'inscription mercredi 16 octobre 2002 Statut Membre Dernière intervention 12 juin 2006 - 16 juin 2005 à 08:20
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013 - 17 juin 2005 à 12:20
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32098-fibonacci-a-l-infini

cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
17 juin 2005 à 12:20
En effet, j'avait bien pensé faire un tableau DWord, mais j'était parti sur l'idée de faire des opérations sur N bytes. Puis, de fil en aiguille, j'en suis venu à ça. Il y a donc des restes de l'architecture de base que je n'ai pas pensé à modifier...

Mais ça va être fait.

Sinon, j'ai bien la fonction pour la mutliplication, mais pas celle en assembleur. Je la donne donc comme ça :

Function GrosNombreMultiplie(a,b:TGrosNombre):TGrosNombre;
var
i,j,k:integer;
reste:word;
begin
fillchar(result,sizeof(TGrosNombre),0);
for i:=0 to high(TGrosNombre)-1 do
for j:=0 to i do
begin
reste:=result[i]+a[j]*b[i-j];
k:=i;
result[i]:=reste mod Base;
reste:=reste div Base;
inc(k);
while (reste<>0) and (k<high(TGrosNombre)) do
begin
reste:=result[k]+reste;
result[k]:=reste mod Base;
reste:=reste div Base;
inc(k);
end;
end;
end;

Normalement, ça marche...

CIAO
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
17 juin 2005 à 12:07
Salut Barbichette,

Quelques petites remarques :
1 - Je crois que le temps que tu mesures est surtout celui de l'exécution de la ligne caption:=IntToStr(n); Pour voir les perfs il vaut mieux ajouter une variable de boucle (bcl) et écrire

temps := GetTickCount;
a := GrosNombreAffect(1);
b := GrosNombreAffect(2);
for n := 1 to rang do
begin
caption := inttostr(n);
for bcl := 1 to 100 do
c := GrosNombreadditionAsm(a, b);
a := b;
b := c;
end;
temps := GetTickCount - temps;

... et là on peut obtenir un temps sans doute plus significatif, qui ne montre pas de différence notables entre l'addition en Pascal ou en assembleur.

2 - Plus interessant, il y a une différence visible (et prévisible) si on modifie le type TGrosNombre et quelques constantes
const
MaxGrosNombre=100; // on conserve la capacité
base=256*256;
type
TGrosNombre=array[0..MaxGrosNombre] of Word;

en divisant MaxGrosNombre par 2 on divise aussi le temps de calcul ! l'addition en assembleur est facile a modifier (ax au lieu de al et double incrémentation des pointeurs ebx et edx)

et pourquoi pas un tableau de DWORD !!!! ;o))

bon courage pour la multiplication !

Ken@vo
cs_sergejb Messages postés 20 Date d'inscription mercredi 16 octobre 2002 Statut Membre Dernière intervention 12 juin 2006
16 juin 2005 à 08:20
Je pense que le source doit etre intéressant, mais pour le moment impossible de télécharger:
Erreur HTTP 404 - Fichier ou répertoire introuvable.
Services Internet (IIS)
A plus
Rejoignez-nous