Esercizi floating-point

Pasquale 90
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

Risposte
feddy
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$

Pasquale 90
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

feddy
Cosa intendi con precisione infinita?

Questo risultato si commenta usando la stima per l'errore relativo associato alla somma, che dovresti avere negli appunti.

Pasquale 90
"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 ?

feddy
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

Pasquale 90
Cioè che l'operazione aritmetica di sottrazione in macchina è mal condiozionata.
Per questo si ha un errore relativo alto rispetto alla precisione di macchina. :roll: :roll:

feddy
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

Pasquale 90
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 ?

feddy
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...

Pasquale 90
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.

feddy
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.)

Pasquale 90
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 ?

feddy
No, lavora con base $2$, e con una mantissa di $24$ cifre binarie (anche se alla fine ne usa $23$)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.