Aritmetica di macchina - floating point, precisione di macchina e cancellazione
In questa pagina 8
Prerequisiti: come si scrivono i bit di un numero in virgola mobile è in Numeri in virgola mobile IEEE 754Virgola fissa e virgola mobile; formato IEEE 754 a 32 e 64 bit (segno, esponente in eccesso 127, mantissa con 1 implicito); conversioni svolte nei due versi; valori speciali, denormalizzati, intervallo, precisione e arrotondamento.Numeri in virgola mobile IEEE 754 →; qui interessa invece quanto sbaglia il calcolatore quando fa un conto e come si progetta una formula che sbaglia poco. Il calcolo numerico nasce da questo fatto: il calcolatore non lavora con i numeri reali, ma con un insieme finito di numeri, e ogni risultato porta con sé un errore.
Struttura dell'elaboratore: quello che serve al calcolo numerico
Il dettaglio dell'hardware è in Architettura e organizzazione di un calcolatoreDifferenza tra architettura (ciò che vede il programmatore) e organizzazione (come è realizzata); struttura e funzione; le quattro funzioni e i quattro componenti; macchina di von Neumann e IAS; generazioni tecnologiche e legge di Moore.Architettura e organizzazione di un calcolatore →; per il calcolo numerico bastano tre fatti.
- Modello di von Neumann. La CPU (unità di controllo, ALU che esegue le operazioni, registri) legge dalla memoria centrale sia le istruzioni del programma sia i dati, li elabora e riscrive i risultati in memoria. Ogni dato occupa un numero fissato di bit: da qui nasce l'insieme finito di numeri di questa nota.
- Unità di informazione. Un bit vale o ; un byte sono bit; i processori attuali lavorano su parole di bit. Con bit si hanno configurazioni diverse, quindi al più numeri rappresentabili.
- Interi. Si usano in complemento a due (Rappresentazione dei numeri interi con segnoInteri con segno su n bit: modulo e segno, complemento a 1, complemento a 2 ed eccesso K; intervalli rappresentabili, calcolo dell'opposto, estensione del segno.Rappresentazione dei numeri interi con segno →): con bit l'intervallo è . Le operazioni tra interi sono esatte finché il risultato resta nell'intervallo; fuori si ha overflow. Esempio a bit: l'intervallo è ; si scrive invertendo i bit di e sommando : (controllo: ✓); dà (il risultato «si avvolge»). In MATLAB gli interi
int8,int32invece saturano (int8(127)+1vale127); in Python gli interi non hanno limite. - Reali. Si usa la virgola mobile in bit (doppia precisione: bit di segno, di esponente, di mantissa), che è l'argomento del resto della nota. È il tipo predefinito di MATLAB e il
floatdi Python. - Costo. Il tempo di un algoritmo numerico si misura in flop (operazioni in virgola mobile). Un processore da tavolo esegue circa – flop/s, ma leggere un dato dalla memoria centrale costa molto più di un'operazione: per questo la memoria è a livelli (registri, cache, RAM, Gerarchia di memoria e principio di localitàCaratteristiche delle memorie (posizione, capacità, unità di trasferimento, metodo di accesso, prestazioni, volatilità); compromesso costo-capacità-velocità e gerarchia a livelli; località temporale e spaziale con esempi; hit, miss e tempo medio di accesso con calcolo svolto.Gerarchia di memoria e principio di località →). Esempio: risolvere un sistema lineare richiede circa flop (Fattorizzazione LU, pivoting e CholeskyRisolvere $A\mathbf x=\mathbf b$ con Gauss equivale a fattorizzare $A=LU$ ($L$ triangolare inferiore con $1$ sulla diagonale e i moltiplicatori $l_{ik}=\frac{a_{ik}^{(k)}}{a_{kk}^{(k)}}$ sotto la diagonale, $U$ la matrice a scala finale) e poi risolvere $L\mathbf y=\mathbf b$ (in avanti) e $U\mathbf x=\mathbf y$ (all'indietro). Esiste (ed è unica) se i minori principali di testa $\det A_k$, $k<n$, sono $\ne0$. Costo $\frac23n^3$ flop per la fattorizzazione, $2n^2$ per ogni termine noto; $\det A=\prod u_{kk}$. Con un pivot piccolo l'algoritmo è instabile: il pivoting parziale (scambio di righe che porta in posizione di pivot l'elemento di modulo massimo della colonna) dà $PA=LU$ con $|l_{ik}|\le1$ ed esiste per ogni $A$ invertibile. Se $A$ è simmetrica definita positiva esiste $A=LL^T$ (Cholesky), con $l_{jj}=\sqrt{a_{jj}-\sum_{k<j}l_{jk}^2}$ e $l_{ij}=\frac{a_{ij}-\sum_{k<j}l_{ik}l_{jk}}{l_{jj}}$; costo $\frac13n^3$, senza pivoting.Fattorizzazione LU, pivoting e Cholesky →), cioè meno di un secondo a flop/s.
Errore assoluto e relativo
Sia il valore esatto e un'approssimazione.
Definizione (errori).
- Errore assoluto: (ha le unità di ).
- Errore relativo: per (adimensionale).
L'errore relativo è quello che conta: sbagliare di nella lunghezza di un ponte di è poco (), sbagliare di nella lunghezza di una vite da è assurdo. Un errore relativo di circa corrisponde a circa cifre significative corrette.
Esempio. e . , : circa cifre corrette.
L'insieme dei numeri di macchina
Definizione (sistema di numeri di macchina ). Un numero normalizzato è dove è la base, il numero di cifre significative (la precisione), l'esponente. Si aggiunge lo .
In doppia precisione IEEE: , (52 bit di mantissa più l' nascosto), . In singola: , .
Quanti numeri? Segno: scelte; prima cifra: scelte; le altre cifre: scelte; esponente: valori; più lo zero:
Esempio (sistema "giocattolo"). : numeri con . I valori positivi sono con :
| numeri positivi | distanza tra consecutivi | |
|---|---|---|
Sono numeri positivi: con gli opposti e lo zero ✓. Il più grande è , il più piccolo positivo .
Grafico interattivo: I 16 numeri positivi di F(2,3,−1,2): la distanza raddoppia a ogni potenza di 2, quindi la densità è maggiore vicino a zero
Nell'intervallo tra e non c'è nessun numero (nei sistemi reali lo riempiono i denormalizzati: vedi Numeri in virgola mobile IEEE 754Virgola fissa e virgola mobile; formato IEEE 754 a 32 e 64 bit (segno, esponente in eccesso 127, mantissa con 1 implicito); conversioni svolte nei due versi; valori speciali, denormalizzati, intervallo, precisione e arrotondamento.Numeri in virgola mobile IEEE 754 →).
Arrotondamento e precisione di macchina
Un reale con non è in generale un numero di macchina: lo si sostituisce con il numero di macchina più vicino, che indichiamo (arrotondamento).
Teorema (errore di arrotondamento). Se , allora si chiama unità di arrotondamento (unit roundoff); è la precisione di macchina (distanza tra e il numero di macchina successivo).
Dimostrazione. Sia . In quell'intervallo di esponente i numeri di macchina sono equispaziati con passo (il peso dell'ultima cifra). Il più vicino dista al massimo mezzo passo: . Poiché si ha , quindi
Il punto chiave: l'errore relativo è limitato da , non l'errore assoluto. L'errore assoluto cresce con (nel sistema giocattolo, il passo è vicino a ma vicino a ).
| formato | cifre decimali sicure | |||
|---|---|---|---|---|
| singola | circa | |||
| doppia | circa |
Esempio (arrotondamento nel sistema giocattolo). Qui e .
- sta tra e : distanze e , quindi . Errore relativo ✓.
- sta tra e : , errore relativo ✓.
- : overflow (risultato o errore). : underflow (si arrotonda a o al numero più vicino).
- sta tra e , più vicino a : . Il è assorbito: perché il risultato cambi, a si deve sommare più di (con esatto si cade a metà tra e e il pareggio va verso , il numero con ultima cifra pari).
Aritmetica di macchina: le operazioni
Lo standard IEEE richiede che ogni operazione elementare tra numeri di macchina dia il risultato esatto arrotondato:
Modello standard. , con (purché non ci sia overflow o underflow).
Ogni operazione introduce quindi un errore relativo piccolo, ma le proprietà algebriche si perdono:
- La somma non è associativa: in doppia precisione ma , perché vicino a il passo tra numeri di macchina è e il viene assorbito.
- : ha sviluppo binario periodico e viene arrotondato (risultato ).
- Quindi non si confrontano mai due reali con
==: si controlla .
Esempio (l'ordine conta, in con arrotondamento a cifre significative). Si vuole sommare . Il risultato esatto è .
- Da sinistra: ; poi . Risultato (errore ).
- Sommando prima i piccoli: ; poi . Risultato (errore ).
Regola pratica: si sommano prima i termini di modulo piccolo.
Cancellazione numerica
Il caso più insidioso è la sottrazione di due numeri quasi uguali. Non è la sottrazione a introdurre errore (se la differenza di due numeri di macchina è calcolata esattamente): è che mette in evidenza gli errori già presenti nei dati.
Siano e le due quantità con i loro errori relativi (ad esempio di arrotondamento). Allora Se il fattore è enorme: l'errore relativo del risultato è molto più grande di quello dei dati. Le cifre in comune ai due numeri si cancellano, e restano solo le ultime, quelle già inquinate.
Procedura (evitare la cancellazione). Se un'espressione contiene la differenza di quantità quasi uguali, la si riscrive in forma algebricamente equivalente senza sottrazione (razionalizzazione, identità trigonometriche, sviluppo di Taylor, formula alternativa).
Esempio 1: differenza di radici. Si calcola lavorando con cifre significative.
- e . Ciascuno ha errore relativo piccolo, al più .
- Differenza: , con una sola cifra significativa. Il valore esatto è : errore relativo , cioè centinaia di volte l'errore dei dati. Il fattore massimo previsto è .
- Riformulando: : corretto fino all'ultima cifra. La somma al denominatore non ha cancellazione.
Esempio 2: per piccolo. Per il limite è (Taylor: , vedi Sviluppi di Mac-Laurin notevoliTabella degli sviluppi di Mac-Laurin da sapere a memoria (e^x, sin, cos, log(1+x), (1+x)^alpha, arctan, sinh, cosh, tan) e regole per combinarli: algebra degli o piccoli, prodotti, funzioni composte, quanti termini tenere.Sviluppi di Mac-Laurin notevoli →). Ma già per il coseno vale e nel calcolo si perdono 12 cifre su 16; per il coseno è arrotondato a esattamente e la formula dà . Si usa invece l'identità , senza sottrazione:
Esempio 3: equazione di secondo grado. Per con e , la radice somma due numeri quasi opposti. Si calcola prima la radice senza cancellazione, , e poi si ricava l'altra dal prodotto delle radici :
Codice
import numpy as np
print(np.finfo(float).eps) # precisione di macchina
print(np.spacing(1e8), np.spacing(1e16)) # passo tra numeri di macchina
print(0.1 + 0.2 == 0.3)
print((1e16 + 1) - 1e16, (1e16 - 1e16) + 1)
for k in (2, 4, 6, 8): # (1 - cos x)/x^2: formula diretta e riformulata
x = 10.0**-k
print(x, (1 - np.cos(x)) / x**2, 2*np.sin(x/2)**2 / x**2)
b, c = 1e8, 1.0 # x^2 - b x + c = 0, radici ~1e8 e ~1e-8
d = np.sqrt(b*b - 4*c)
x1 = (b + d) / 2
print(x1, (b - d) / 2, c / x1) # radice grande, radice piccola (cancellazione), radice piccola stabileOutput:
2.220446049250313e-16
1.4901161193847656e-08 2.0
False
0.0 1.0
0.01 0.4999958333473664 0.49999583334722214
0.0001 0.4999999969612645 0.4999999995833334
1e-06 0.5000444502911705 0.4999999999999583
1e-08 0.0 0.5
100000000.0 7.450580596923828e-09 1e-08La radice piccola con la formula diretta vale invece di (errore del ); con è esatta. In MATLAB: eps (precisione di macchina), eps(x) (passo vicino a x), realmax, realmin, sqrt, cos.
Errori tipici
- Confondere ed (differiscono per un fattore ): è la distanza tra e il successivo, è l'errore relativo massimo di arrotondamento.
- Dire che l'errore assoluto di arrotondamento è sempre : è l'errore relativo a essere limitato.
- Dare la colpa alla sottrazione: la sottrazione è esatta, è la perdita di cifre significative nei dati a diventare visibile.
- Confrontare reali con
==o fermare un ciclo quando due numeri sono uguali.
Domande d'esame
- Definire errore assoluto e relativo e dire quale dei due è limitato dall'arrotondamento. Risposta: il relativo, .
- Quanto vale la precisione di macchina in doppia precisione e cosa rappresenta? Risposta: : distanza tra e il numero successivo; l'errore relativo di arrotondamento è al più .
- Perché è calcolata male per grande e come si migliora? Risposta: cancellazione tra numeri quasi uguali; si usa .
- Quali interi si rappresentano con bit in complemento a due e cosa succede sommando al massimo? Risposta: ; dà overflow e il risultato si avvolge a (in MATLAB
int16satura a ). - L'addizione di macchina è associativa? Risposta: no, per l'assorbimento: ma .
Versione ripasso
Elaboratore (Architettura e organizzazione di un calcolatoreDifferenza tra architettura (ciò che vede il programmatore) e organizzazione (come è realizzata); struttura e funzione; le quattro funzioni e i quattro componenti; macchina di von Neumann e IAS; generazioni tecnologiche e legge di Moore.Architettura e organizzazione di un calcolatore →): CPU e memoria, ogni dato con un numero fissato di bit ( bit, valori). Interi in complemento a due su , esatti salvo overflow (8 bit: , ; in MATLAB int8 satura). Reali in doppia precisione: bit. Costo in flop: – flop/s; LU circa flop.
Errori: assoluto , relativo ; relativo cifre corrette.
Numeri di macchina : , , (Numeri in virgola mobile IEEE 754Virgola fissa e virgola mobile; formato IEEE 754 a 32 e 64 bit (segno, esponente in eccesso 127, mantissa con 1 implicito); conversioni svolte nei due versi; valori speciali, denormalizzati, intervallo, precisione e arrotondamento.Numeri in virgola mobile IEEE 754 →). Quanti: . In : numeri, , , passo da a . Doppia precisione: .
Arrotondamento: , (errore relativo limitato, non l'assoluto). : doppia , singola . Dimostrazione: passo , errore mezzo passo, . In : ; (assorbimento); overflow.
Operazioni: , . Somma non associativa: ; ; mai == tra reali. In : vale da sinistra e sommando prima i piccoli.
Cancellazione: errore relativo di , enorme se . Si riformula:
- : con cifre (errore ) contro ;
- (a la prima dà , la seconda );
- radici di : prima quella senza cancellazione, poi .
Passaggi principali.
- Tabella di : : (passo ); : (passo ); : (passo ); : (passo ). Errore relativo di : .
- Radici di a cifre: (una cifra sola); amplificazione massima . Forma stabile: .
- in doppia: dà ; la formula diretta per dà (errore ), il prodotto dà .
- Codice:
np.finfo(float).eps,np.spacing(x); in MATLABeps,eps(x),realmax,realmin. - Cifre corrette: ha ed , cioè circa cifre. Interi a bit: .
- Radici senza cancellazione: si calcola prima la radice in cui e hanno lo stesso segno, , poi .
- Doppia precisione: vicino a il passo tra numeri di macchina è , vicino a è .
Regole. Si sommano prima i termini piccoli; se la differenza di due numeri di macchina è esatta; si confronta con ; è esatto solo se il numero è già di macchina; overflow se supera , underflow sotto .
Errori tipici: confondere e ; dire che l'errore assoluto è ; incolpare la sottrazione (è esatta).
Esercizi su questo argomento
- Esercizio - Cancellazione in (1 - cos x)/x2 con cinque cifre significative
- Esercizio - Numeri di macchina di F(2,3,-1,2), arrotondamento e somma non associativa
- Esercizio - pivot piccolo in aritmetica a quattro cifre e costo della fattorizzazione
- Esercizio - Problema ben condizionato e algoritmo instabile, ex - 1 per x piccolo
- Esercizio - Propagazione dell'errore in una differenza e riformulazione di sqrt(x2+1) - x
- Esercizio - Radici di un'equazione di secondo grado in F(10,4) senza cancellazione