begin process at 2012 05 28 10:18:12
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

Calculateur 32bits ... problème de débordement !!!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Calculateur 32bits ... problème de débordement !!!

vendredi 6 février 2009 à 14:24:02 | Calculateur 32bits ... problème de débordement !!!

boguista

j'ai à coder le calcul suivant :

S= c. [(a.b + (a+b).2^15 + 2^30)/2^32] sachant que a, b et c sont sur 16 bits

Avez vous un algorithme précis qui puisse retourner une valeur exacte de sortie S sur 16 bits sans aucune perte de l'information !

Bon de ma part j'ai realisé ce code mais un test sur un émalateur 32bits me donne des résultats non conforme à ceux que j'ai calculé moi même

Voici un en algorithmmique une vue de ce code, j'attends vos remarques et merci .

{
if ( (a + b) * 32768) > (UINT32_MAX - (a * b) - 2^30))
   {
      u32LocalProduct1 = ((a * b) / 65536) + ((( a+ b)* 32768) / 65536) + 16384;
   }
   else
   {
      u32LocalProduct1 = (( a* b) + ((a + b) * 32768)+ 1073741824)/ 65536;
   }

   if (c== 0)
   {
      S = 0;
   }
   else
   {
      if (u32LocalProduct1 > (UINT32_MAX / c))
      {
         u32LocalProduct2 = (u32LocalProduct1 / 65536) * c;
         S = MIN(u32LocalProduct2,65535);
      }
      else
      {        
         u32LocalProduct2 = ((u32LocalProduct1 * c) + 32768)/ 65536;
        S = MIN(u32LocalProduct2,65535);
      }
}


vendredi 6 février 2009 à 18:36:24 | Re : Calculateur 32bits ... problème de débordement !!!

gaspos

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
    }

void shift_right ( uint64 * a , int nbbit )
    {
    a->lo = (a->lo >> nbbit) | (a->hi << (32-nbbit)) ;
    a->hi >>= nbbit ;
    }

void shift_left ( uint64 * a , int nbbit )
    {
    a->hi = (a->hi << nbbit) | (a->lo >> (32-nbbit)) ;
    a->lo <<= nbbit ;
    }

// 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 } ;

    uint64 r1,r2,r3 ;

    shift_left( &aa,15 ) ;  // aa = (a+b).2^15
    add( aa,bb,&r1 ) ;      // r1 = a.b + (a+b).2^15
    add( dd,r1,&r2 ) ;      // r2 = r1 + 2^30 = a.b + (a+b).2^15 + 2^30
                            // r2.hi = r2/2^32
    return( c * r2.hi )  ;
    }


et voila !

Hadrien



Cette discussion est classée dans : 32bits, if, else, u32localproduct1, u32localproduct2


Répondre à ce message

Sujets en rapport avec ce message

projet bataille navale problème!!! [ par krimoluv ] Bonsoir à tous,voila j'ai mon projet bataille navalle qui approche les 1900 lignes. Malheuresement je n'ai pas eu le resultat esconté car en compilant verification si le mot est palindrome [ par sdiri_med ] Salut Je n'ai pas arrivé à résoudre un problème de vérification d'une chaine de caractères. Le problème consiste à vérifier si un mot est palindrome besoin d'aide pour mon if, il ne fonctionne pas ...? [ par flowneo ] bonjour, un petit problème dans ma boucle if, je voudrais comparer chaque lettre de la chaine du Joueur2 à celles du Joueur1: for (i=0;i>bienPlace[i gestion evenement en sdl [ par jilou2008 ] bonjour j ai creer un petit programme en c++ avec sdl , j utilise le joystick pour deplacer une image sur l ecran et la coller ensuite seulement pour [HELP] Lecture de fichier limité [ par Gadouine ] Bonjour je viens solicité votre aide car je suis en rade d'idée voila je cherche a crée un programe qui sers a extraire une donné (pour l'instant seu probleme sscanf [ par maha1987 ] bjr tt le monde jai un prob dans ce prog (dans la fct verif si letat =4 le prog doit sticker la valeur de la partie entiere et decimale de la chaine d erreur c [ par maha1987 ] Bonjour tout le monde, j'ai ce programme C qui prend des caractères et doit afficher si la chaîne constituée par ces caractères est valide(constituée selection bien défini d'une feuille de calcul [ par aouaoua ] Bonjour le forum je travaille actuellement sur un petit projet sous Excel/VBA mais sincèrement je n'arrive pas a m'en sortir. j'ai créer un userforme FONCTION SUR C++ [ par debutanteencplusplus ] SALUT !!! je veux faire une fonction qui teste si un nombre n est ondulant . voila ce que j'ai fait ,mais ça marche pas [color=gray]int est_ondulant pcap_findalldevs_ex ne trouve pas toutes les interfaces [ par marroucha ] Bonjour à tous, Mon problème est comme l'indique le titre ,pcap_findalldevs_ex(...) ne me trouve pas toutes les interfaces j'ai remarqué ceci en se ré


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales