Created: 2024-04-05 ven 18:44
Abbiamo gia' visto diversi algoritmi numerici per effettuare calcoli matematici, come gli integrali o le equazioni differenziali;
Abbiamo visto la rappresentazione in virgola fissa e virgola mobile dei numeri reali nel calcolatore;
Molti dei valori numerici che abbiamo ottenuto sono in realta' delle approssimazioni dei veri risultati che ci saremmo aspettati;
Per quale motivo dobbiamo limitarci a delle approssimazioni?
Risposta:
Perche' il calcolatore ha un numero limitato di bit per rappresentare i numeri;
Vogliamo rappresentare \((10.40625)\) in virgola mobile.
Supponiamo che il nostro computer sia un po' vecchiotto e abbia a disposizione solo 7 bit per rappresentare la mantissa.
Parte intera: \(10 \rightarrow (1010)_2\);
Parte decimale: \(\frac{1}{4} + \frac{1}{8} + \frac{1}{32} \rightarrow (.01101)_2\)
Mantissa: \((.0100110)_2\)
Esponente: \(-127 + 130 = 3 \rightarrow (10000010)_2\);
Analizziamo meglio…
Mantissa: \((.0100110)_2\)
Per l'esponente, abbiamo detto che la virgola va spostata di 3 posti verso destra, ottenendo
\((010.0110)_2\), aggiungendo l'1 a sinistra sottointeso si ottiene \((1010.0110)_2\)
Notate qualcosa?
\((1010.0110)_2 \rightarrow (10.375)\)
Ci siamo persi per strada l'ultimo bit!
Dato che abbiamo a disposizione solo 7 bit per la mantissa non abbiamo precisione "a sufficienza" per rappresentare il nostro valore esattamente;
D'ora in poi chiameremo \(fl(y)\) la rappresentazione del calcolatore del valore teorico \(y\).
Su alcuni valori il calcolatore commette un errore di rappresentazione!
Imparare facendo…
Scrivere un programma che calcoli la derivata della funzione \(y = sin(x)\) in un punto scelto dall'utente.
Stampare in modo leggibile:
- il valore della derivata calcolata
- l'errore commesso rispetto alla vera derivata
- lo step \(h\) scelto
per ogni h in [10-2, 10-3, …, 10-15].
Se abbiamo fatto tutto correttamente, per \(x=1\) il risultato dovrebbe essere simile a questo…
Cosa ci aspettiamo che succeda per \(h \rightarrow 0\)?
In teoria l'approssimazione della derivata dovrebbe essere piu' precisa, quindi l'errore piu' piccolo…
Se osserviamo bene l'errore minimo e' in corrispondenza di \(10^{-8}\).
Da quel punto in avanti, il calcolatore inizia a commettere errori di rappresentazione, che man mano accumulandosi ci fanno divergere dalla vera soluzione