Newsgroup: it.comp.lang.c
Titolo: limiti dei tipi predefiniti

Salve ragazzi...
volevo farvi una domanda che ho dalla prima volta che ho fatto la
funzione ricorsiva per il fattoriale ( anche voi l'avete fatto vero?
fattoriale e fibonacci :)  ). La funzione consisteva in:
long fattoriale(long number)
{
	if (number <= 1)
   	return 1;
	else
		return number * fattoriale(number - 1);
}
solo che al 17! o forse anche prima dava risultati sballati, perchè il
numero era più grande del massimo che ci sta in 4 byte, cioe' di 
2^(32 -1) = 
2147483648
. Come si fa a risolvere questo problema?
Grazie per un'eventuali risposta :)

 Grazie per un'eventuali risposta :)
Cosi'.....
Questo e' 1000! :
+402387260077093773543702433923003985719374864210714632543799910429938512398
6290
2059204420848696940480047998861019719605863166687299480855890132382966994459
0997
4245040870737599188236277271887325197795059509952761208749754624970436014182
7809
4646496291056393887437886487337119181045825783647849977012476632889835955735
4325
1318532395846307555740911426241747434934755342864657661166779739666882029120
7379
1438537195882498081268678383745597317461360853795345242215865932019280908782
9730
8431392844403281231558611036976801357304216168747609675871348312025478589320
7671
6913244842623613141250878020800026168315102734182797770478463586817016436502
4153
6913982812648102130927612448963599287051149649754199093422215668325720808213
3318
6116811553615836546984046708975602900950537616475847728421889679646244945160
7653
5340819890138544248798495995331910172335555660213945039973628075013783761530
7127
7619268490343526252000158885351473316117021039681759215109077880193931781141
9454
5257223865541461062892187960223838971476088506276862967146674697562911234082
4392
0816015378088989396451826324367161676217916890977991190375403127462228998800
5195
4444142820121873617459926429565817466283029555702990243241531816172104658320
3678
6906117260158783520751516284225540265170483304226143974286933061690897968482
5901
2545832716822645806652676995865268227280707578139185817888965220816434834482
5993
2660433676601769996128318607883861502794659551311565520360939881806121385586
0030
1435694527224206344631797460594682573103790084024432438465657245014402821885
2524
7093519062092902313649327349756551395872055965422874977401141334696271542284
5862
3773875382304838656889764619273838149001407673104466402598994902222217659043
3990
1886018566526485061799702356193897017860040811889729918311021171229845901641
9210
6888438712185564612496079872290851929681937238864261483965738229112312502418
6649
3531439701374285319266498753372189406942814341185201580141233448280150513996
9429
0153483077644569099073152433278288269864602789864321139083506217095002597389
8635
5427719674282224875758676575234422020757363056949882508796892816275384886339
6909
9598262809561214509948717012445164612603790293091208890869420285106401821543
9945
7156805941872748998094254742173582401063677404595741785160829230135358081840
0969
9637252423056085590370062427124341690900415369010593398383577793941097002775
3472
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000
000000000
Tommy

Questo e' 1000! :
Sei ubriaco ?
-- 
<void> Kickandoti mi sentirei come se stessi picchiando un bimbo che caga
<Pikkio> ti sporcheresti le mani
<void> Non te lo pulisci il sedere ?
<Pikkio> no, ho la faccia come il culo

fattoriale e fibonacci :)
   Li adoro (WARNING, da questo punti in poi tutto e` IMVHO, e,
soprattutto, mi aggancio al tuo post senza alcnu motivo particolare, a
parte il gusto della chiacchiera)... Io non so chi abbia inventato per
primo questo esercizio, ma spiegare la ricorsione obbligando gli
studenti a calcolare ricorsivamente, come primo esercizio, una
funzione la cui definizione e` intrinsecamente iterativa, mi sembra
quanto meno perverso. 8)
   Ai miei tempi andavano piu` di moda le torri di Hanoi (non che
fossero poi questo gran problema). Certo, spiegare la natura del
problema delle torri di Hanoi a studenti ignari richiede del tempo
(circa dieci minuti, secondo me), il fattoriale o Fibonacci (e su
quest'ultimo ho i miei dubbi) sono immediatamente piu` comprensibili.
Ma, a questo punto, perche` non implementare ricorsivamente la
moltiplicazione tra interi? (con un costo di spiegazione aggiuntiva
ancora minore)
-- 
S.L.

tuo TCP e ti secco l'HD, segone. (GFX-dev)

 Grazie per un'eventuali risposta :)
unsigned long long estende l'orizzonte fino a 2^64.
Non sono certo che sia standard. 

 Sei ubriaco ?
No, pero' ammetto di aver fatto lo scemo...
unsigned long long (parte dell'ultimissimo standard) a parte che arriva a 64
bits (non arriva davvero a fare 1000!), esistono varie librerie per
calcolare numeri con precisione arbitraria.
ad esempio:
http://www.swox.com/gmp/
che contiene una descrizion della libreria GMP.
Alternativamente uno puo' programmarsi tale libreria da solo..... (per
divertirsi, non per altro!)
Tommy

 divertirsi, non per altro!)
ad esempio il 1000! che ho postato l'ho calcolato con una mia classe che mi
sono implementato in C++. Non sara' sicuramente veloce come GMP o altri
prodotti piu' "professionali", ma parecchi anni fa, quando la feci, mi diede
grosse soddisfazioni.
Tommy

Sei ubriaco anche tu. Di` la verita`. :).
   Reiteratamente ubriaco. O ricorsivamente, non saprei. :)
-- 
S.L.