Floating point.

Studente Anonimo
Studente Anonimo
Avrei una domanda sulla somma nella rappresentazione floating point. Prendiamo \( F(2,53,-1021,1024) \) dove abbiamo che ciascun numero \(x \in \mathbb{R} \) della forma \( x=(-1)^s (0,a_1\ldots a_{53}a_{54} \ldots) 2^{e}\) è rappresentabile in un computer con \( \operatorname{fl}(x)= (-1)^s (0,a_1\ldots a_{53}) 2^{e} \)
dove \( s \in \{0,1\} \), \( -1021 \leq e \leq 1024 \).

Mi domandavo in primo luogo come fa un computer a interpretare ad esempio \( 1/10 \) se io glielo do come input.

L'errore assoluto per \(x \) grandi è molto grande infatti \( \left| x - \operatorname{fl}(x) \right| \leq 2^{e-53} \)
Mentre l'errore relativo è piccolo infatti
\( \frac{\left| x - \operatorname{fl}(x) \right|}{\left|x \right|} \leq 2^{-52} \)

Mi domandavo perché non è "importante" che l'errore assoluto sia cosi grande.

Inoltre la prof ha aggiunto che \(x+y \) con \(x,y \in \mathbb{R} \) in un computer, siccome \( F(2,53,-1021,1024) \) non è stabile rispetto alla somma si opera nel seguente modo, \( \operatorname{fl}(\operatorname{fl}(x)+\operatorname{fl}(y)) \). E misurando la stabilità della somma in \( F \) abbiamo che
\[ \operatorname{fl}(\operatorname{fl}(x)+\operatorname{fl}(y)) \leq 2^{-52} \max_{x,y} \left( \frac{\left| x \right|}{\left|x+y \right|} +\frac{\left| y \right|}{\left|x+y \right|}+1\right) \]
Pertanto se \(x \sim -y \) l'operazione della somma è molto instabile.
Quindi il computer fa molto male operazioni del tipo \(2,0000001-2\). Ma se io provo a usare la calcolatrice del computer e faccio \(2,0000001-2\) mi da il risultato giusto non mi restituisce valori enormi.

Risposte
feddy
"3m0o":

Mi domandavo in primo luogo come fa un computer a interpretare ad esempio 1/10 se io glielo do come input


Come sai l'aritmetica di macchina lavora con base 2. Se calcoli $\frac{1}{10}$ in base 2 vedrai che non ammette una rappresentazione binaria "esatta" (per convincertene fai la divisione binaria).

Ad ogni modo, usando lo standard in uso hai che la rappresentazione decimale in aritmetica di macchina è

0.1000000000000000055511151231257827021181583404541015625


I dettagli li trovi qui. Quindi, nella pratica, il computer non memorizza esattamente 0.1


"3m0o":
Pertanto se x∼−y l'operazione della somma è molto instabile.
Quindi il computer fa molto male operazioni del tipo 2,0000001−2. Ma se io provo a usare la calcolatrice del computer e faccio 2,0000001−2 mi da il risultato giusto non mi restituisce valori enormi.


Quello che può accadere per avere il risultato esatto è che i conti vengano fatti in base 10, infatti sia il primo numero che il secondo (e anche la loro differenza) sono rappresentabile *esattamente* in quella base. In MatLab invece calcolando l'errore relativo trovi $1.64 \cdot 10^(-9)$. Di fatti, in base 2
2.0000001-2.0 = 9.9999999836342112757847644388675689697265625E-8

feddy
Un modo per capire come lavora la calcolatrice del tuo pc è questo: calcola $1 + 10^{-9} - 1$.In precisione doppia è rappresentato come
1.000000082740371E-9


Probabilmente invece la tua calcolatrice darà $10^{-9}$, questo significa che non lavora in precisione doppia

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