cs_sergejb
Messages postés20Date d'inscriptionmercredi 16 octobre 2002StatutMembreDernière intervention12 juin 2006
-
16 juin 2005 à 08:20
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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.
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 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és20Date d'inscriptionmercredi 16 octobre 2002StatutMembreDernière intervention12 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
17 juin 2005 à 12:20
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
17 juin 2005 à 12:07
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
16 juin 2005 à 08:20
Erreur HTTP 404 - Fichier ou répertoire introuvable.
Services Internet (IIS)
A plus