mulkrul
2010-10-06 18:19:32 UTC
Sto muovendo i primi passi con Python ed ho già notato un paio di cose "strane" rispetto a linguaggi tipo Pascal,
Fortran e C. Di solito vengono dedicati due byte alla memorizzazione di un numero intero per cui il maxint è 2^15=32768.
In Python ho realizzato un piccolo script che calcola il fattoriale di un numero mediante una funzione ricorsiva:
def Fattoriale(n):
if n==0:
return 1
else:
return n*Fattoriale(n-1)
n=input("Inserisci un numero naturale: ")
print "\n Il fattoriale di: ",n," e': ",Fattoriale(n)
Dato che il fattoriale cresce molto rapidamente, mi aspettavo dei risultati sballati già nel calcolo di 8!=40320 ed
invece, con mio grande stupore, il mio script riesce a calcolare correttamente perfino 998!=
402790050127220994538240674597601587306681545756471103647447357787726238637266286878923131618587992793273261872069265323955622495490298857759082912582527118115540044131204964883707335062250983503282788739735011132006982444941985587005283378024520811868262149587473961298417598644470253901751728741217850740576532267700213398722681144219777186300562980454804151705133780356968636433830499319610818197341194914502752560687555393768328059805942027406941465687273867068997087966263572003396240643925156715326363340141498803019187935545221092440752778256846166934103235684110346477890399179387387649332483510852680658363147783651821986351375529220618900164975188281042287183543472177292257232652561904125692525097177999332518635447000616452999984030739715318219169707323799647375797687367013258203364129482891089991376819307292252205524626349705261864003453853589870620758596211518646408335184218571196396412300835983314926628732700876798309217005024417595709904449706930796337798861753941902125964936412501007284147114260935633196107341423863071231385166055949914432695939611227990169338248027939843597628903525815803809004448863145157344706452445088044626373001304259830129153477630812429640105937974761667785045203987508259776060285826091261745049275419393680613675366264232715305430889216384611069135662432391043725998805881663054913091981633842006354699525518784828195856033032645477338126512662942408363494651203239333321502114252811411713148843370594801145777575035630312885989779863888320759224882127141544366251503974910100721650673810303577074640154112833393047276025799811224571534249672518380758145683914398263952929391318702517417558325636082722982882372594816582486826728614633199726211273072775131325222240100140952842572490801822994224069971613534603487874996852498623584383106014533830650022411053668508165547838962087111297947300444414551980512439088964301520461155436870989509667681805149977993044444138428582065142787356455528681114392680950815418208072393532616122339434437034424287842119316058881129887474239992336556764337968538036861949918847009763612475872782742568849805927378373244946190707168428807837146267156243185213724364546701100557714520462335084082176431173346929330394071476071813598759588818954312394234331327700224455015871775476100371615031940945098788894828812648426365776746774528000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
mentre con 999! sballa per eccesso di ricorsione.
Mi sembra di capire che non ci sia quindi un uno spazio predeterminato per la memorizzazione di un intero. Sbaglio?
Altra questione: Python introduce un sensibile errore nel calcolo di sin(pi) che dovrebbe fare 0 (e tutte le
calcolatrici che possiedo lo calcolano correttamente). Infatti il seguenta script:
import math
print math.sin(math.pi)
mi dà come risultato: 1.22460635382e-16
Come si conciliano questa estrema "raffinatezza" nell'aritmetica intera e questa "grossolanità" nei calcoli in virgola
mobile?
Fortran e C. Di solito vengono dedicati due byte alla memorizzazione di un numero intero per cui il maxint è 2^15=32768.
In Python ho realizzato un piccolo script che calcola il fattoriale di un numero mediante una funzione ricorsiva:
def Fattoriale(n):
if n==0:
return 1
else:
return n*Fattoriale(n-1)
n=input("Inserisci un numero naturale: ")
print "\n Il fattoriale di: ",n," e': ",Fattoriale(n)
Dato che il fattoriale cresce molto rapidamente, mi aspettavo dei risultati sballati già nel calcolo di 8!=40320 ed
invece, con mio grande stupore, il mio script riesce a calcolare correttamente perfino 998!=
402790050127220994538240674597601587306681545756471103647447357787726238637266286878923131618587992793273261872069265323955622495490298857759082912582527118115540044131204964883707335062250983503282788739735011132006982444941985587005283378024520811868262149587473961298417598644470253901751728741217850740576532267700213398722681144219777186300562980454804151705133780356968636433830499319610818197341194914502752560687555393768328059805942027406941465687273867068997087966263572003396240643925156715326363340141498803019187935545221092440752778256846166934103235684110346477890399179387387649332483510852680658363147783651821986351375529220618900164975188281042287183543472177292257232652561904125692525097177999332518635447000616452999984030739715318219169707323799647375797687367013258203364129482891089991376819307292252205524626349705261864003453853589870620758596211518646408335184218571196396412300835983314926628732700876798309217005024417595709904449706930796337798861753941902125964936412501007284147114260935633196107341423863071231385166055949914432695939611227990169338248027939843597628903525815803809004448863145157344706452445088044626373001304259830129153477630812429640105937974761667785045203987508259776060285826091261745049275419393680613675366264232715305430889216384611069135662432391043725998805881663054913091981633842006354699525518784828195856033032645477338126512662942408363494651203239333321502114252811411713148843370594801145777575035630312885989779863888320759224882127141544366251503974910100721650673810303577074640154112833393047276025799811224571534249672518380758145683914398263952929391318702517417558325636082722982882372594816582486826728614633199726211273072775131325222240100140952842572490801822994224069971613534603487874996852498623584383106014533830650022411053668508165547838962087111297947300444414551980512439088964301520461155436870989509667681805149977993044444138428582065142787356455528681114392680950815418208072393532616122339434437034424287842119316058881129887474239992336556764337968538036861949918847009763612475872782742568849805927378373244946190707168428807837146267156243185213724364546701100557714520462335084082176431173346929330394071476071813598759588818954312394234331327700224455015871775476100371615031940945098788894828812648426365776746774528000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
mentre con 999! sballa per eccesso di ricorsione.
Mi sembra di capire che non ci sia quindi un uno spazio predeterminato per la memorizzazione di un intero. Sbaglio?
Altra questione: Python introduce un sensibile errore nel calcolo di sin(pi) che dovrebbe fare 0 (e tutte le
calcolatrici che possiedo lo calcolano correttamente). Infatti il seguenta script:
import math
print math.sin(math.pi)
mi dà come risultato: 1.22460635382e-16
Come si conciliano questa estrema "raffinatezza" nell'aritmetica intera e questa "grossolanità" nei calcoli in virgola
mobile?