Matlab e i grandi numeri 2

Messaggioda 3m0o » 02/03/2020, 03:02

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?
3m0o
Cannot live without
Cannot live without
 
Messaggio: 867 di 5333
Iscritto il: 02/01/2018, 15:00

Re: Matlab e i grandi numeri 2

Messaggioda axpgn » 02/03/2020, 21:08

Oh, ma basta il "semplice" Just Basic :D

Codice:
print 2^2137
20003257882752310617761830492208540597621370325131012875879217957524794459533444196416484447788228627674316498028337259430728195448737300146756388777376808154350780091267543969735190144912674926632927818537599170783007946091016632746446447852310617482478282137920245421843331859115803263923280994050722884357413175004938381596505536213298749602559006362563131893406844870331667639266730866787128932761680127090101482081574086364885633422100929937351535558706325365160462161593072235515279296512576006891451068479518496288439122004550688222127969546597602323023803470622166190572384600018186630129978733542428592364297263658459766879192950505472
axpgn
Cannot live without
Cannot live without
 
Messaggio: 15044 di 40664
Iscritto il: 20/11/2013, 22:03

Re: Matlab e i grandi numeri 2

Messaggioda 3m0o » 02/03/2020, 22:12

Sergio ha scritto: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 :D ) il mio computer non capisce il significato di \( 10^{23} \) (come anche di altri numeri molto più piccoli).
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 :-D ), come faccio? Il mio computer quando gli scrivo
\( x- y \) interpreta la cosa come \( 99999999999999991611392 - 99999999999999991611392 = 0 \) quindi come faccio a recuperare l'errore di approssimazione??
3m0o
Cannot live without
Cannot live without
 
Messaggio: 877 di 5333
Iscritto il: 02/01/2018, 15:00

Re: Matlab e i grandi numeri 2

Messaggioda axpgn » 02/03/2020, 23:19

Beh, in teoria è semplicissimo :-D

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 :D
Ho estremizzato ma questa tecnica l'ho effettivamente usata in Excel (per sfizio :-D )
axpgn
Cannot live without
Cannot live without
 
Messaggio: 15045 di 40664
Iscritto il: 20/11/2013, 22:03

Re: Matlab e i grandi numeri 2

Messaggioda axpgn » 02/03/2020, 23:23

Comunque esistono apposite librerie per la gestione di "grandi numeri" :D
axpgn
Cannot live without
Cannot live without
 
Messaggio: 15046 di 40664
Iscritto il: 20/11/2013, 22:03

Re: Matlab e i grandi numeri 2

Messaggioda axpgn » 03/03/2020, 00:30

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


[-X Non è vero: $sqrt(2)$ è la rappresentazione esatta della lunghezza della diagonale del quadrato di lato unitario :-D :lol:

Cordialmente, Alex
Ultima modifica di axpgn il 03/03/2020, 10:36, modificato 1 volta in totale.
axpgn
Cannot live without
Cannot live without
 
Messaggio: 15048 di 40664
Iscritto il: 20/11/2013, 22:03


Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite