2014-10-09 14 views
5

Sono un po 'nuovo alla programmazione e stavo giocando alla codifica oggi cercando di utilizzare le funzioni e ho creato un semplice codice che ha risolto un problema di matematica che avevo in una delle mie classi. in pratica prende la formula (quantità di batteri) * 2^ore e lo calcola.Come gestire l'overflow in C

Il mio problema è che quando ottengo un numero molto grande non ritorna correttamente, ottengo sempre -2147483648 indietro dopo una certa dimensione di numero. Immagino che questo abbia qualcosa a che fare con l'overflow, ma non sono sicuro al 100% di come funzioni. Quello che sto cercando di capire è come ottenere i numeri reali che sto cercando dopo aver colpito questo overflow. Quindi, cosa posso fare per affrontare l'overflow?

Inizialmente avevo impostato tutto su int, ma dopo un po 'di lettura pensavo che cambiare tutto troppo a lungo potrebbe aiutarmi, ma non è stato così, se questa è una cosa terribile per me andare avanti e lasciarmi conoscere! Anche i numeri di test che sto usando sono 1500 e 24, che restituisce sempre il numero sopra.

Ecco il codice Grazie!

#include<stdio.h> 
#include<math.h> 
long bacteria(long b, long h); 

int main(void) 
{ 
     long f,g; 

     scanf("%ld%ld",&f,&g); 
     f = bacteria(f,g); 
     printf("%ld\n",f); 

return 0; 
} 

long bacteria(long b,long h) 
{ 
     long d; 
     printf("%ld %ld\n",b,h); 
     d = b * (pow(2,h)); 

return d; 
} 
+3

Usa '' powl' per long', 'restituisce pow'' double' –

+0

devo certo codice [qui] (https://groups.google.com/d/topic/comp.lang .apl/Lu2tgqanK5Q/discussione) derivato principalmente dal codice di esempio nel CFAQ. –

+0

Grazie! Non avevo idea che Pow restituisse un doppio! – Yosvan10

risposta

2

Sì, il tuo sospetto di overflow è giusto. Il tipo di dati C ha un intervallo. È necessario utilizzare alcuni bignum library per gestire i casi in cui è necessario un intervallo più ampio. Si noti inoltre che pow restituisce doppio e non long come ci si potrebbe aspettare.

Se non si cura della precisione, è possibile utilizzare double anziché long che offre un intervallo molto più ampio.

Live example here

+0

Grazie a questo ha aiutato un sacco! – Yosvan10

+0

Sono contento che sia stato d'aiuto. –

1

uso longlong tipo di dati invece di semplice lungo per contenere valori più grandi.

+2

Penso che questa non sia una risposta irragionevole - in definitiva non affronta la questione di cosa fare con l'overflow quando succede, ma almeno è probabile che funzioni più a lungo! – Synchro

+0

Accetto che la soluzione fornita non soddisfi il problema dell'overflow. Ma ci sono possibilità molto alte che l'utilizzo di un tipo di dati longlong risolva il problema di Yosvan10. – Wajahat

2

Buona domanda. Ho affrontato lo stesso problema un po 'di tempo fa ho usato l'esempio seguente. Check it out se questo ti aiuta

http://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc-a-tutorial

codice di seguito dal link qui sopra.

#include<stdio.h> 
int main() 
{ 
    int t; 
    int a[200]; //array will have the capacity to store 200 digits. 
    int n,i,j,temp,m,x; 

    scanf("%d",&t); 
    while(t--) 
    { 
     scanf("%d",&n); 
     a[0]=1; //initializes array with only 1 digit, the digit 1. 
     m=1; // initializes digit counter 

     temp = 0; //Initializes carry variable to 0. 
     for(i=1;i<=n;i++) 
     { 
      for(j=0;j<m;j++) 
      { 
       x = a[j]*i+temp; //x contains the digit by digit product 
       a[j]=x%10; //Contains the digit to store in position j 
       temp = x/10; //Contains the carry value that will be stored on later indexes 
      } 
      while(temp>0) //while loop that will store the carry value on array. 
      { 
       a[m]=temp%10; 
       temp = temp/10; 
       m++; // increments digit counter 
      } 
     } 
       for(i=m-1;i>=0;i--) //printing answer 
       printf("%d",a[i]); 
       printf("\n"); 
    } 
    return 0; 
} 
+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – RobV

+0

Aggiunto il codice e sopra con i commenti. – Vaibhav