Overflow Algoritmo Fattoriale

di il
3 risposte

Overflow Algoritmo Fattoriale

Salve, ho da poco iniziato l'università e mi sto cimentando nella programmazione in C anche a casa per allenamento. Stavo programmando un algoritmo che dato un numero n restituisse il suo n! (n fattoriale). Ho notato che però funziona fino ad un certo numero n, infatti dopo 12!, dal 13! in poi restituisce dei valori completamente casuali, e dal 16! in poi numeri negativi. Per la mia poca esperienza direi che è dovuto al fatto che non ha abbastanza memoria per gestire calcoli più elevati, quindi overflow. Voi più esperti che dite?
Vi lascio qua sotto l'algoritmo:
#include "stdio.h"
int main()
{
	int n, i, Prodotto;
	printf("Inserire un numero!\n");
	scanf("%d", &n);
	Prodotto = 1;
	i = n; 
	while (n > 0)
	{
		Prodotto = Prodotto * n;
		n--;
	}
	printf("%d!=%d", i, Prodotto);
	return 0;
}

3 Risposte

  • Re: Overflow Algoritmo Fattoriale

    Conosci il limite di un valore int a 32 bit?
  • Re: Overflow Algoritmo Fattoriale

    Si tratta di un classico problema di limitazione del formato numerico con i tipi di default del C: un problema arcaico discusso un'infinità numerabile di volte. Vedi ad esempio questo thread.


    PS: Per questa volta ho provveduto ad aggiungere i tag CODE al tuo post. Leggi il Regolamento.
  • Re: Overflow Algoritmo Fattoriale

    Ciao e benvenuto! Per prima cosa, il codice va postato tra i tag CODE per migliorarne la leggibilità.

    Venendo al tuo problema, hai ragione: un intero segnato (singed integer) ha valori da -2^(31) a 2^(31)-1. E' quindi un numero a 32 bit, dei quali uno è riservato al segno. Se usi un unsigned int, puoi rappresentare numeri che vanno da 0 a 2^(32)-1. Ciò detto, 16! è un numero che richiede oltre 44 bit, e quindi semplicemente "non ci sta"

    P.S. Per verificare quanti bit richiede la rappresentazione di un numero, è sufficiente calcolarne il logaritmo in base 2.
Devi accedere o registrarti per scrivere nel forum
3 risposte