gaspos
Messages postés17Date d'inscriptionjeudi 9 décembre 2004StatutMembreDernière intervention20 février 2009 6 févr. 2009 à 18:36
En fait, ce qu'il te faut, c'est un calcul sur 64 bits...
Je suppose que tu n'as pas accès aux entiers sur 64 bits sinon tu n'aurais pas posté ce message !
Du coup, voici une petite solution toute propre : implémenter les calculs 64 bits dont tu as besoin :
typedef struct
{
unsigned long hi,lo ;
} uint64 ;
void add ( uint64 a , uint64 b , uint64 * r )
{
r->lo = a.lo + b.lo ;
r->hi = a.hi + b.hi ;
if ((r->lo < a.lo) || (r->lo < b.lo))
r->hi++ ; // ajout de la retenue s'il y a lieu
}
// c. [(a.b + (a+b).2^15 + 2^30)/2^32]
unsigned long compute ( unsigned short a , unsigned short b , unsigned short c )
{
uint64 aa = { 0,a+b } ;
uint64 bb = { 0,a*b } ; // pas de débordement si a et b sur 16 bits
uint64 dd = { 0,1<<30 } ;