Esercizi floating-point
Buonasera,
ho i seguenti numeri $a=6.393942e-3\,\b=6.393941e-3$
Faccio la sottrazione carta e penna esce $c=0.0000001e-2$, invece su matlab usando il formato long mi esce $c'= 0.633000259000000$.
Ovviamente non mi potevo aspettare il risultato vero in matlab, ma questo che è uscito non me lo spiego, cioè $a,b$ sono due numeri quasi uguali quindi facendo la sottrazione in matlab si ha il fenomeno della cancellazione numerica, quindi dovrei perdere delle cifre significative per questo si il precedente risultato ?
Grazie
ho i seguenti numeri $a=6.393942e-3\,\b=6.393941e-3$
Faccio la sottrazione carta e penna esce $c=0.0000001e-2$, invece su matlab usando il formato long mi esce $c'= 0.633000259000000$.
Ovviamente non mi potevo aspettare il risultato vero in matlab, ma questo che è uscito non me lo spiego, cioè $a,b$ sono due numeri quasi uguali quindi facendo la sottrazione in matlab si ha il fenomeno della cancellazione numerica, quindi dovrei perdere delle cifre significative per questo si il precedente risultato ?
Grazie
Risposte
Se i due numeri sono vicini in modulo, allora si ha il fenomeno di cancellazione numerica. Tuttavia facendo quell'operazione su MatLab a me risulta $-9.999999994736442e-10$
si hai ragione ho sbagliato a caricare i dati. comunque prendendo come numeri
$x=1.2345$
$y=1.2344$
precisione infinita
$x-y=0.0001=1e-5$
invece su matlab mi esce $9.999999999998899e-05$.
Cioè per commentare questo risultato procedo cosi,considero i due numeri in forma normalizzata
$x'=0.123450000000000e1$,
$y'=0.123440000000000e1$
ne faccio la sottrazione in macchina
$x'(-)y'=0.00010000000000=1e-5$
dove sbaglio
$x=1.2345$
$y=1.2344$
precisione infinita
$x-y=0.0001=1e-5$
invece su matlab mi esce $9.999999999998899e-05$.
Cioè per commentare questo risultato procedo cosi,considero i due numeri in forma normalizzata
$x'=0.123450000000000e1$,
$y'=0.123440000000000e1$
ne faccio la sottrazione in macchina
$x'(-)y'=0.00010000000000=1e-5$
dove sbaglio
Cosa intendi con precisione infinita?
Questo risultato si commenta usando la stima per l'errore relativo associato alla somma, che dovresti avere negli appunti.
Questo risultato si commenta usando la stima per l'errore relativo associato alla somma, che dovresti avere negli appunti.
"feddy":
Cosa intendi con precisione infinita?.
carta e penna.
Quindi dovrei fare
$abs(1*10^(-5)-9.999999999998899*10^(-5))/abs(1*10^(-5))=8.999999999998899$
l'ordina di grandezza dell'errore relativo è dell'ordine dell'unità, quindi ci sono zero cifre corrette.
va bene ?
Okay, da qui è chiaro che l'errore relativo è alto. Ma quello che intendevo io era quello che viene scritto a pag. 46 di queste slide: https://www.math.unipd.it/~alvise/CN_IN ... beamer.pdf
Quello che osservi tu è una conseguenza
Quello che osservi tu è una conseguenza
Cioè che l'operazione aritmetica di sottrazione in macchina è mal condiozionata.
Per questo si ha un errore relativo alto rispetto alla precisione di macchina.
Per questo si ha un errore relativo alto rispetto alla precisione di macchina.


occhio però: è malcondizionata quando i due numeri sono vicini in modulo, altrimenti non è mica detto che ogni volta che si sottraggono due numeri si producono risultati errati
Ciao feddy, riprendo di nuovo questo topic, ma i dubbi sorgono di volta in volta che ci si sporca le mani.
Riprendo i dati della scorsa volta, cioè
$a=6.393942e-3\,\ b=6.393941e-3$
la differenza in matlab è $a-b=9.999999994736442e-10$
invece a carta e penna è $1e-8$
Come detto la scorsa volta la sottrazione è mal condizionato quando si hanno operandi quasi uguali, come questi, per cui si ha tale risultato in matlab.
Ora mi chiedo ma perchè è cosi, mi spiego meglio, è possibile determinare a priori la differenza in aritmetica esatta dei numeri $a,b$ a carta e penna ?
Riprendo i dati della scorsa volta, cioè
$a=6.393942e-3\,\ b=6.393941e-3$
la differenza in matlab è $a-b=9.999999994736442e-10$
invece a carta e penna è $1e-8$
Come detto la scorsa volta la sottrazione è mal condizionato quando si hanno operandi quasi uguali, come questi, per cui si ha tale risultato in matlab.
Ora mi chiedo ma perchè è cosi, mi spiego meglio, è possibile determinare a priori la differenza in aritmetica esatta dei numeri $a,b$ a carta e penna ?
Scusa ma non ho capito cosa intendi con "è possibile determinare a priori la differenza in aritmetica esatta dei numeri a,b a carta e penna ?"
Mi pare che tu l'abbia già determinata...
Mi pare che tu l'abbia già determinata...
No voglio, se considero
$a=6.393942e-3$
$b=6.393941e-3$
posso determinare la differenza $a-b=9.999999994736442e-10$ a carta e penna, cioè, Matlab opera cosi: prende i dati input $a,b$ li normalizza quindi ottiene
$a^(**)=0.6393942e-2$
$b^(**)=0.6393941e-2$
in format long e dovrebbero risultare
$a^(**)=0.6393942000000000e-2$
$b^(**)=0.6393941000000000e-2$
ora $a^(**), b^(**)$ sono due numeri macchina, quindi posso fare la sottrazione in macchina, quindi mi dovrebbe risultare $c^(**)=0.0000001000000000e-2=1e-8$
In altre parole posso conoscere gli operandi normalizzati da Matlab e simulare la sottrazione fatta in macchina.
Vedi pagina 18 del http://oldwww.unibas.it/utenti/debonis/ ... merica.pdf
intendo questo.
$a=6.393942e-3$
$b=6.393941e-3$
posso determinare la differenza $a-b=9.999999994736442e-10$ a carta e penna, cioè, Matlab opera cosi: prende i dati input $a,b$ li normalizza quindi ottiene
$a^(**)=0.6393942e-2$
$b^(**)=0.6393941e-2$
in format long e dovrebbero risultare
$a^(**)=0.6393942000000000e-2$
$b^(**)=0.6393941000000000e-2$
ora $a^(**), b^(**)$ sono due numeri macchina, quindi posso fare la sottrazione in macchina, quindi mi dovrebbe risultare $c^(**)=0.0000001000000000e-2=1e-8$
In altre parole posso conoscere gli operandi normalizzati da Matlab e simulare la sottrazione fatta in macchina.
Vedi pagina 18 del http://oldwww.unibas.it/utenti/debonis/ ... merica.pdf
intendo questo.
Okay, ora è chiaro cosa intendi. Sì, puoi sempre scrivere tu stesso "a carta e penna" l'operazione che viene fatta in aritmetica di macchina utilizzando la loro rappresentazione in floating point. Cioè, si scrive la loro rappresentazione macchina, e si fanno i conti con quelli.
Ricorda però che $N=10, t=6$ non sono i parametri usati da MatLab per la rappresentazione. Perciò non puoi aspettarti di trovare gli stessi risultati. Nel PDF che ti ho allegato (https://www.math.unipd.it/~alvise/CN_IN ... beamer.pdf) ci sono altri esempi simili ai tuoi, con altri sistemi (mantissa diversa, $L,U$ con valori diversi,ecc.)
Ricorda però che $N=10, t=6$ non sono i parametri usati da MatLab per la rappresentazione. Perciò non puoi aspettarti di trovare gli stessi risultati. Nel PDF che ti ho allegato (https://www.math.unipd.it/~alvise/CN_IN ... beamer.pdf) ci sono altri esempi simili ai tuoi, con altri sistemi (mantissa diversa, $L,U$ con valori diversi,ecc.)
Si, Matlab lavora con $N=10$ e $t=16$ quindi i numeri
$a^(**)=0.6393942000000000e−2$
$b^(**)=0.6393941000000000e−2$
dovrebbero essere numeri macchina, quindi ora "Matlab può lavorarci" però non mi trovo con il risultato, dove sbaglio ?
$a^(**)=0.6393942000000000e−2$
$b^(**)=0.6393941000000000e−2$
dovrebbero essere numeri macchina, quindi ora "Matlab può lavorarci" però non mi trovo con il risultato, dove sbaglio ?
No, lavora con base $2$, e con una mantissa di $24$ cifre binarie (anche se alla fine ne usa $23$)