Floating point.

Messaggioda 3m0o » 28/02/2020, 17:06

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

Re: Floating point.

Messaggioda feddy » 05/03/2020, 01:42

3m0o ha scritto: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 è

Codice:
0.1000000000000000055511151231257827021181583404541015625


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


3m0o ha scritto: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
Codice:
2.0000001-2.0 = 9.9999999836342112757847644388675689697265625E-8
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2645 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Floating point.

Messaggioda feddy » 05/03/2020, 18:31

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


Probabilmente invece la tua calcolatrice darà $10^{-9}$, questo significa che non lavora in precisione doppia
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2651 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA


Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite