Calcul en précision étendue

Signaler
Messages postés
5
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
19 juin 2005
-
Messages postés
341
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
17 juin 2008
-
Bonjours,


Je veux programmer en C un ensemble complet de fonctions pour additionner, multiplier des nombres en précision étendue. Les nombres devront avoir une taille possible de 100 chiffres en base 10000.Les nombres seront lus indifféremment au clavier ou sur fichier texte. Pae exemple, la syntaxe sur le fichier pourrait donner ça :


Un nombre


Un autre nombre


Un code opératoire (+ ou *)


Un nombre


Un autre nombre


Un code opératoire (+ ou *)


Un nombre


Un autre nombre


Un code opératoire (+ ou *)


Un nombre


Un autre nombre


Un code opératoire (+ ou *)


On arrête sur le caractère (q).


Le nom du fichier sera passé en utilisant argc et argv.





1ere question : est ce que je dois prendre une base 10000 ou 10 pour mes nombres ?


J’hésite…


2ème question : voici mon début de programme…Quelqu’un pourrait corriger ce j’ai fait ? Merci d’avance..








#include








long int* add(long int,long int);





void main()


{


long int a,b,op,*p;


printf("quel op‚ration voulez vous effectuer,taper 1 pour la multiplication\n ou 2 pour l'addition\n");


scanf("%ld",&op);


printf("donner le premier chiffre\n");


scanf("%ld",&a);


printf("donner le deuxieme chiffre\n");


scanf("%ld",&b);


if(op==1)


{


p=add(a,b);


}


else


{


printf("le chiffre tape est mauvais");


exit(1);


}





printf("le nombre est [%ld][%ld] en base 10000\n",*p,*(p+1));


}











long int* add(long int a,long int b)


{


long int *p,base;


base=10000;





*p=(a+b);


if(*p>=base)


{


printf("passage ds le if");


a=((a+b)-base);


b=1;


p=(long int*) malloc(2*sizeof(long int));


*p=b;


*(p+1)=a;


}


else


{


printf("passage ds le else");


p=(long int*) malloc(1*sizeof(long int));


*(p)=0;


*(p+1)=(a+b);


}





return(p);

1 réponse

Messages postés
341
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
17 juin 2008
2
Bonjour,

excuse moi de ne pas comprendre ce que tu veux dire mais précision étendu c'est quoi pour toi ? Un nombre entier ou flottant ?

Une base de 10 est bien mieux approprié parce que une base de 10000 je vois pas l'intérêt surtout pour l'afficher(c'est quoi tes 10000 caractères différents pour l'afficher ^^ )!!!!



Si c'est bien des entiers avec lesquels tu travailles, il "suffit" de faire les opérations sur des nombres de 128-bit ou même 256-bit çà devrait suffir .

Pour bien optimiser il faudrait de l'assembleur mais si tu ne connais
pas voilà comment additionner deux nombres 64-bit formé de deux nombres
32-bit .



void add(int n1[2],int n2[2],int res[2])

{

res[0]=n1[0]+n2[0];

if(res[0]<n1[0])

{

res[1]=n1[1]+n2[1]+1;

}

else

{


res[1]=n1[1]+n2[1];


}

}



ou en assembleur(je sais pas si çà passe à la compilation)




void add(int n1[2],int n2[2],int res[2])

{

asm

{

mov eax,[n1];

add [n2];

mov [res],eax;

mov eax,[n1+1];

adc [n2+1];

mov [res+1],eax;

}



}




Pour la multiplication il faut trouver un algo rapide mais je n'en ai pas en tête.


A m a u r y