Matlab e i grandi numeri 2
Scusatemi, mi sfuggono un paio di cose.
Su matlab se utilizzo la rappresentazione format rat per vedere come il computer interpreta l'input e scrivo \( 10^{23} \) mi esce come risultato \( 99999999999999991611392 \), e non capisco il motivo.
Però se poi gli chiedo di calcolarmi \(100000000000000000000000 - 99999999999999991611392 \) mi dice che il risultato è \( 0 \)...
Come fa il computer ad interpretare quel valore come \( 10^{23} \) ??
Come fa il computer a dirmi che quella differenza fa zero?
Come fa il computer a capire la differenza tra \(100000000000000000000000 - 99999999999999991611392 \) e \(99999999999999991611399 - 99999999999999991611392 \) o i singoli addendi ??
Edit: perché ad esempio wolfram riesce a darmi la risposta giusta e matlab no?
Su matlab se utilizzo la rappresentazione format rat per vedere come il computer interpreta l'input e scrivo \( 10^{23} \) mi esce come risultato \( 99999999999999991611392 \), e non capisco il motivo.
Però se poi gli chiedo di calcolarmi \(100000000000000000000000 - 99999999999999991611392 \) mi dice che il risultato è \( 0 \)...
Come fa il computer ad interpretare quel valore come \( 10^{23} \) ??
Come fa il computer a dirmi che quella differenza fa zero?
Come fa il computer a capire la differenza tra \(100000000000000000000000 - 99999999999999991611392 \) e \(99999999999999991611399 - 99999999999999991611392 \) o i singoli addendi ??
Edit: perché ad esempio wolfram riesce a darmi la risposta giusta e matlab no?
Risposte
Oh, ma basta il "semplice" Just Basic

print 2^2137 20003257882752310617761830492208540597621370325131012875879217957524794459533444196416484447788228627674316498028337259430728195448737300146756388777376808154350780091267543969735190144912674926632927818537599170783007946091016632746446447852310617482478282137920245421843331859115803263923280994050722884357413175004938381596505536213298749602559006362563131893406844870331667639266730866787128932761680127090101482081574086364885633422100929937351535558706325365160462161593072235515279296512576006891451068479518496288439122004550688222127969546597602323023803470622166190572384600018186630129978733542428592364297263658459766879192950505472
"Sergio":
A quanto ne so, format rat è solo una approssimazione con frazioni continue.
Si, però se non vado errato, un computer (standard, 64-bits) approssima i numeri reali con i numeri macchina \( F(2,53,-1021,2014) \) e con format rat osservi cosa succede in memoria nel computer quando gli dai in pasto un numero reale, chiaramente il computer deve "discretizzare" e approssimarlo con un numero macchina e \( 10^{23} \) non è un numero macchina e dunque lo approssima con una frazione. In questo senso intendevo che il computer interpreta \( 10^{23} \) come \(99999999999999991611392 \) perché effettivamente in memoria lo scrive così, in quanto \( 10^{23} \not\in F \).
E io mi domandavo se diamo ad un computer un numero che non è un numero macchina potrà solo approssimarlo per una frazione, pertanto con quali algoritmi può un software ricavare il risultato esatto di una sottrazione tra un numero che non è macchina e la sua approssimazione ?? Se volessi fare una calcolatrice in c++ (e ti assicuro che non è il caso

In generale un computer "capisce pochissimi" numeri in maniera esatta, tutti gli altri numeri sono approssimazioni. Ad esempio diciamo che le \(x,y \) sono due numeri che hanno la stessa approssimazione in numero macchina ovvero \( x \neq y \) ma \( \operatorname{fl}(x) = \operatorname{fl}(y) \) ed inoltre abbiamo pure il caso che \( \operatorname{fl}(x) \neq x \).
Chiaramente abbiamo che \( x - y \neq 0 \) ma come fa un software a restituirmi il valore esatto della differenza (o una sua approssimazione) se il computer interpreta \( x \) e \( y \) come numeri macchina che sono uguali e dunque interpreta il calcolo come \( \operatorname{fl}( \operatorname{fl}(x) - \operatorname{fl}(y) )= \operatorname{fl}(0)=0 \) ??
Nel nostro esempio abbiamo che
\( x= 10^{23} \) e \( y =99999999999999991611392 \)
\( \operatorname{fl}(x)=\operatorname{fl}(y)=99999999999999991611392\)
Se voglio creare una calcolatrice che datogli l'input \( x- y \) mi restituisce \( 8388608 \) ovvero la differenza esatta (credo

\( x- y \) interpreta la cosa come \( 99999999999999991611392 - 99999999999999991611392 = 0 \) quindi come faccio a recuperare l'errore di approssimazione??
Beh, in teoria è semplicissimo
Per esempio poniamo che la tua macchina "lavori" con numeri di due cifre al massimo, come si fa la somma $112+223$ ?
Si somma $1+2$ e $12+23$ ed eventualmente si riporta
Ho estremizzato ma questa tecnica l'ho effettivamente usata in Excel (per sfizio
)

Per esempio poniamo che la tua macchina "lavori" con numeri di due cifre al massimo, come si fa la somma $112+223$ ?
Si somma $1+2$ e $12+23$ ed eventualmente si riporta

Ho estremizzato ma questa tecnica l'ho effettivamente usata in Excel (per sfizio

Comunque esistono apposite librerie per la gestione di "grandi numeri"

"Sergio":
… restando inteso che comunque per i numeri irrazionali (che sono la stragrande maggioranza) non esiste alcuna rappresentazione "esatta"; …



Cordialmente, Alex