Salta al contenuto
Note per Studenti Aritmetica di macchina - floating point, precisione di macchina e cancellazione

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.

Errore assoluto e relativo

Sia xx il valore esatto e x~\tilde x un'approssimazione.

Definizione (errori).

  • Errore assoluto: Ea=∣x−x~∣E_a = |x - \tilde x| (ha le unità di xx).
  • Errore relativo: Er=∣x−x~∣∣x∣E_r = \dfrac{|x - \tilde x|}{|x|} per x≠0x \ne 0 (adimensionale).

L'errore relativo è quello che conta: sbagliare di 1 m1\,\text{m} nella lunghezza di un ponte di 100 m100\,\text{m} è poco (1%1\%), sbagliare di 1 m1\,\text{m} nella lunghezza di una vite da 5 cm5\,\text{cm} è assurdo. Un errore relativo di circa 5⋅10−k5 \cdot 10^{-k} corrisponde a circa kk cifre significative corrette.

Esempio. x=π=3,14159265x = \pi = 3{,}14159265 e x~=3,14\tilde x = 3{,}14. Ea=0,00159265E_a = 0{,}00159265, Er=0,00159265/3,14159265≈5,07⋅10−4E_r = 0{,}00159265 / 3{,}14159265 \approx 5{,}07 \cdot 10^{-4}: circa 33 cifre corrette.

L'insieme dei numeri di macchina

Definizione (sistema di numeri di macchina F(β,t,L,U)F(\beta, t, L, U)). Un numero normalizzato è x=± (d0,d1d2…dt−1)β⋅β e,d0≠0,L≤e≤Ux = \pm\,(d_0{,}d_1 d_2 \dots d_{t-1})_\beta \cdot \beta^{\,e}, \qquad d_0 \ne 0,\quad L \le e \le U dove β\beta è la base, tt il numero di cifre significative (la precisione), ee l'esponente. Si aggiunge lo 00.

In doppia precisione IEEE: β=2\beta = 2, t=53t = 53 (52 bit di mantissa più l'11 nascosto), e∈[−1022,1023]e \in [-1022, 1023]. In singola: t=24t = 24, e∈[−126,127]e \in [-126, 127].

Quanti numeri? Segno: 22 scelte; prima cifra: β−1\beta - 1 scelte; le altre t−1t - 1 cifre: βt−1\beta^{t-1} scelte; esponente: U−L+1U - L + 1 valori; più lo zero: #F=2(β−1)β t−1(U−L+1)+1.\#F = 2(\beta - 1)\beta^{\,t-1}(U - L + 1) + 1.

Esempio (sistema "giocattolo"). F(2,3,−1,2)F(2, 3, -1, 2): numeri ±(1,m1m2)2⋅2e\pm(1{,}m_1 m_2)_2 \cdot 2^e con e∈{−1,0,1,2}e \in \{-1, 0, 1, 2\}. I valori positivi sono (1+m/4)⋅2e(1 + m/4)\cdot 2^e con m=0,1,2,3m = 0, 1, 2, 3:

ee numeri positivi distanza tra consecutivi
−1-1 0,5, 0,625, 0,75, 0,8750{,}5,\ 0{,}625,\ 0{,}75,\ 0{,}875 0,1250{,}125
00 1, 1,25, 1,5, 1,751,\ 1{,}25,\ 1{,}5,\ 1{,}75 0,250{,}25
11 2, 2,5, 3, 3,52,\ 2{,}5,\ 3,\ 3{,}5 0,50{,}5
22 4, 5, 6, 74,\ 5,\ 6,\ 7 11

Sono 1616 numeri positivi: #F=2⋅1⋅4⋅4+1=33\#F = 2\cdot 1\cdot 4 \cdot 4 + 1 = 33 con gli opposti e lo zero ✓. Il più grande è xmax⁡=7x_{\max} = 7, il più piccolo positivo xmin⁡=0,5x_{\min} = 0{,}5.

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 00 e xmin⁡x_{\min} 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 xx con xmin⁡≤∣x∣≤xmax⁡x_{\min} \le |x| \le x_{\max} non è in generale un numero di macchina: lo si sostituisce con il numero di macchina più vicino, che indichiamo fl(x)\mathrm{fl}(x) (arrotondamento).

Teorema (errore di arrotondamento). Se xmin⁡≤∣x∣≤xmax⁡x_{\min} \le |x| \le x_{\max}, allora fl(x)=x(1+δ),∣δ∣≤u=12 β 1−t.\mathrm{fl}(x) = x(1 + \delta), \qquad |\delta| \le u = \tfrac12\,\beta^{\,1-t}. uu si chiama unità di arrotondamento (unit roundoff); εM=β1−t=2u\varepsilon_M = \beta^{1-t} = 2u è la precisione di macchina (distanza tra 11 e il numero di macchina successivo).

Dimostrazione. Sia x=(d0,d1… )β⋅βex = (d_0{,}d_1 \dots)_\beta \cdot \beta^e. In quell'intervallo di esponente i numeri di macchina sono equispaziati con passo β e+1−t\beta^{\,e+1-t} (il peso dell'ultima cifra). Il più vicino dista al massimo mezzo passo: ∣x−fl(x)∣≤12β e+1−t|x - \mathrm{fl}(x)| \le \tfrac12 \beta^{\,e+1-t}. Poiché d0≠0d_0 \ne 0 si ha ∣x∣≥βe|x| \ge \beta^{e}, quindi ∣x−fl(x)∣∣x∣≤12β e+1−tβe=12β 1−t.■\frac{|x - \mathrm{fl}(x)|}{|x|} \le \frac{\tfrac12\beta^{\,e+1-t}}{\beta^{e}} = \tfrac12\beta^{\,1-t}. \qquad \blacksquare

Il punto chiave: l'errore relativo è limitato da uu, non l'errore assoluto. L'errore assoluto cresce con ∣x∣|x| (nel sistema giocattolo, il passo è 0,1250{,}125 vicino a 0,50{,}5 ma 11 vicino a 77).

formato tt εM=21−t\varepsilon_M = 2^{1-t} uu cifre decimali sicure
singola 2424 2−23≈1,19⋅10−72^{-23} \approx 1{,}19 \cdot 10^{-7} 5,96⋅10−85{,}96 \cdot 10^{-8} circa 77
doppia 5353 2−52≈2,22⋅10−162^{-52} \approx 2{,}22 \cdot 10^{-16} 1,11⋅10−161{,}11 \cdot 10^{-16} circa 1616

Esempio (arrotondamento nel sistema giocattolo). Qui εM=21−3=0,25\varepsilon_M = 2^{1-3} = 0{,}25 e u=0,125u = 0{,}125.

  • x=2,7x = 2{,}7 sta tra 2,52{,}5 e 33: distanze 0,20{,}2 e 0,30{,}3, quindi fl(2,7)=2,5\mathrm{fl}(2{,}7) = 2{,}5. Errore relativo 0,2/2,7≈0,074≤0,1250{,}2/2{,}7 \approx 0{,}074 \le 0{,}125 ✓.
  • x=5,4x = 5{,}4 sta tra 55 e 66: fl(5,4)=5\mathrm{fl}(5{,}4) = 5, errore relativo 0,4/5,4≈0,074≤0,1250{,}4/5{,}4 \approx 0{,}074 \le 0{,}125 ✓.
  • x=7,6>7+12x = 7{,}6 > 7 + \tfrac12: overflow (risultato ∞\infty o errore). x=0,1<xmin⁡x = 0{,}1 < x_{\min}: underflow (si arrotonda a 00 o al numero più vicino).
  • 1+0,1=1,11 + 0{,}1 = 1{,}1 sta tra 11 e 1,251{,}25, più vicino a 11: fl(1,1)=1\mathrm{fl}(1{,}1) = 1. Il 0,10{,}1 è assorbito: perché il risultato cambi, a 11 si deve sommare più di εM/2=u\varepsilon_M/2=u (con uu esatto si cade a metà tra 11 e 1,251{,}25 e il pareggio va verso 11, il numero con ultima cifra pari).

Aritmetica di macchina: le operazioni

Lo standard IEEE richiede che ogni operazione elementare ∘∈{+,−,×,/}\circ \in \{+, -, \times, /\} tra numeri di macchina dia il risultato esatto arrotondato:

Modello standard. fl(a∘b)=(a∘b)(1+δ)\mathrm{fl}(a \circ b) = (a \circ b)(1 + \delta), con ∣δ∣≤u|\delta| \le u (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 (1016+1)−1016=0(10^{16} + 1) - 10^{16} = 0 ma (1016−1016)+1=1(10^{16} - 10^{16}) + 1 = 1, perché vicino a 101610^{16} il passo tra numeri di macchina è 22 e il +1+1 viene assorbito.
  • 0,1+0,2≠0,30{,}1 + 0{,}2 \ne 0{,}3: 0,10{,}1 ha sviluppo binario periodico e viene arrotondato (risultato 0,300000000000000040{,}30000000000000004).
  • Quindi non si confrontano mai due reali con ==: si controlla ∣a−b∣≤tol max⁡(∣a∣,∣b∣)|a - b| \le \text{tol}\,\max(|a|, |b|).

Esempio (l'ordine conta, in F(10,4)F(10,4) con arrotondamento a 44 cifre significative). Si vuole sommare 1234+0,4+0,41234 + 0{,}4 + 0{,}4. Il risultato esatto è 1234,81234{,}8.

  • Da sinistra: 1234+0,4=1234,4→12341234 + 0{,}4 = 1234{,}4 \to 1234; poi 1234+0,4→12341234 + 0{,}4 \to 1234. Risultato 12341234 (errore 0,80{,}8).
  • Sommando prima i piccoli: 0,4+0,4=0,80{,}4 + 0{,}4 = 0{,}8; poi 1234+0,8=1234,8→12351234 + 0{,}8 = 1234{,}8 \to 1235. Risultato 12351235 (errore 0,20{,}2).

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 b2≤a≤2b\frac b2 \le a \le 2b la differenza di due numeri di macchina è calcolata esattamente): è che mette in evidenza gli errori già presenti nei dati.

Siano a~=a(1+εa)\tilde a = a(1 + \varepsilon_a) e b~=b(1+εb)\tilde b = b(1 + \varepsilon_b) le due quantità con i loro errori relativi (ad esempio di arrotondamento). Allora a~−b~−(a−b)=aεa−bεb⟹∣a~−b~−(a−b)∣∣a−b∣≤∣a∣+∣b∣∣a−b∣ max⁡(∣εa∣,∣εb∣).\tilde a - \tilde b - (a - b) = a\varepsilon_a - b\varepsilon_b \quad\Longrightarrow\quad \frac{|\tilde a - \tilde b - (a - b)|}{|a - b|} \le \frac{|a| + |b|}{|a - b|}\,\max(|\varepsilon_a|, |\varepsilon_b|). Se a≈ba \approx b il fattore ∣a∣+∣b∣∣a−b∣\frac{|a| + |b|}{|a - b|} è 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 1001−1000\sqrt{1001} - \sqrt{1000} lavorando con 55 cifre significative.

  • 1001=31,6386…→31,639\sqrt{1001} = 31{,}6386\ldots \to 31{,}639 e 1000=31,6228…→31,623\sqrt{1000} = 31{,}6228\ldots \to 31{,}623. Ciascuno ha errore relativo piccolo, al più u=5⋅10−5u = 5 \cdot 10^{-5}.
  • Differenza: 31,639−31,623=0,01631{,}639 - 31{,}623 = 0{,}016, con una sola cifra significativa. Il valore esatto è 0,0158074…0{,}0158074\ldots: errore relativo ≈1,2⋅10−2\approx 1{,}2 \cdot 10^{-2}, cioè centinaia di volte l'errore dei dati. Il fattore massimo previsto è 31,639+31,6230,016≈3950\frac{31{,}639 + 31{,}623}{0{,}016} \approx 3950.
  • Riformulando: 1001−1000=1001−10001001+1000=131,639+31,623=163,262=0,015807\sqrt{1001} - \sqrt{1000} = \dfrac{1001 - 1000}{\sqrt{1001} + \sqrt{1000}} = \dfrac{1}{31{,}639 + 31{,}623} = \dfrac{1}{63{,}262} = 0{,}015807: corretto fino all'ultima cifra. La somma al denominatore non ha cancellazione.

Esempio 2: 1−cos⁡xx2\dfrac{1 - \cos x}{x^2} per xx piccolo. Per x→0x \to 0 il limite è 12\tfrac12 (Taylor: cos⁡x=1−x22+…\cos x = 1 - \frac{x^2}2 + \dots, 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 x=10−6x = 10^{-6} il coseno vale 1−5⋅10−131 - 5 \cdot 10^{-13} e nel calcolo si perdono 12 cifre su 16; per x=10−8x = 10^{-8} il coseno è arrotondato a esattamente 11 e la formula dà 00. Si usa invece l'identità 1−cos⁡x=2sin⁡2x21 - \cos x = 2\sin^2\frac x2, senza sottrazione: 1−cos⁡xx2=2sin⁡2(x/2)x2.\frac{1 - \cos x}{x^2} = \frac{2\sin^2(x/2)}{x^2}.

Esempio 3: equazione di secondo grado. Per ax2+bx+c=0ax^2 + bx + c = 0 con b2≫4acb^2 \gg 4ac e b>0b > 0, la radice x2=−b+b2−4ac2ax_2 = \frac{-b + \sqrt{b^2 - 4ac}}{2a} somma due numeri quasi opposti. Si calcola prima la radice senza cancellazione, x1=−b−b2−4ac2ax_1 = \frac{-b - \sqrt{b^2 - 4ac}}{2a}, e poi si ricava l'altra dal prodotto delle radici x1x2=cax_1 x_2 = \frac ca: x2=ca x1.x_2 = \frac{c}{a\,x_1}.

Codice

python
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 stabile

Output:

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-08

La radice piccola con la formula diretta vale 7,45⋅10−97{,}45 \cdot 10^{-9} invece di 10−810^{-8} (errore del 25%25\%); con x2=c/(ax1)x_2 = c/(a x_1) è esatta. In MATLAB: eps (precisione di macchina), eps(x) (passo vicino a x), realmax, realmin, sqrt, cos.

Errori tipici

  • Confondere uu ed εM\varepsilon_M (differiscono per un fattore 22): εM\varepsilon_M è la distanza tra 11 e il successivo, uu è l'errore relativo massimo di arrotondamento.
  • Dire che l'errore assoluto di arrotondamento è sempre ≤u\le u: è 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

  1. Definire errore assoluto e relativo e dire quale dei due è limitato dall'arrotondamento. Risposta: il relativo, ∣δ∣≤u=12β1−t|\delta| \le u = \frac12\beta^{1-t}.
  2. Quanto vale la precisione di macchina in doppia precisione e cosa rappresenta? Risposta: εM=2−52≈2,22⋅10−16\varepsilon_M = 2^{-52} \approx 2{,}22\cdot 10^{-16}: distanza tra 11 e il numero successivo; l'errore relativo di arrotondamento è al più u=εM/2u = \varepsilon_M/2.
  3. Perché x+1−x\sqrt{x+1} - \sqrt{x} è calcolata male per xx grande e come si migliora? Risposta: cancellazione tra numeri quasi uguali; si usa 1x+1+x\frac{1}{\sqrt{x+1} + \sqrt{x}}.
  4. Quali interi si rappresentano con 1616 bit in complemento a due e cosa succede sommando 11 al massimo? Risposta: [−32768, 32767][-32768,\,32767]; 32767+132767+1 dà overflow e il risultato si avvolge a −32768-32768 (in MATLAB int16 satura a 3276732767).
  5. L'addizione di macchina è associativa? Risposta: no, per l'assorbimento: (1016+1)−1016=0(10^{16} + 1) - 10^{16} = 0 ma (1016−1016)+1=1(10^{16} - 10^{16}) + 1 = 1.

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 (nn bit, 2n2^n valori). Interi in complemento a due su [−2n−1,2n−1−1][-2^{n-1},2^{n-1}-1], esatti salvo overflow (8 bit: −5=11111011-5=11111011, 127+1→−128127+1\to-128; in MATLAB int8 satura). Reali in doppia precisione: 1+11+521+11+52 bit. Costo in flop: 10910^9–101110^{11} flop/s; LU 1000×10001000\times1000 circa 23109\frac23 10^9 flop.

Errori: assoluto ∣x−x~∣|x - \tilde x|, relativo ∣x−x~∣/∣x∣|x - \tilde x|/|x|; 5⋅10−k5\cdot10^{-k} relativo ≈\approx kk cifre corrette.

Numeri di macchina F(β,t,L,U)F(\beta,t,L,U): ±(d0,d1…dt−1)β βe\pm(d_0{,}d_1\dots d_{t-1})_\beta\,\beta^e, d0≠0d_0\ne0, L≤e≤UL\le e\le U (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: 2(β−1)βt−1(U−L+1)+12(\beta-1)\beta^{t-1}(U-L+1)+1. In F(2,3,−1,2)F(2,3,-1,2): 3333 numeri, xmin⁡=0,5x_{\min}=0{,}5, xmax⁡=7x_{\max}=7, passo da 0,1250{,}125 a 11. Doppia precisione: t=53t=53.

Arrotondamento: fl(x)=x(1+δ)\mathrm{fl}(x)=x(1+\delta), ∣δ∣≤u=12β1−t|\delta|\le u=\tfrac12\beta^{1-t} (errore relativo limitato, non l'assoluto). εM=β1−t=2u\varepsilon_M=\beta^{1-t}=2u: doppia 2,22⋅10−162{,}22\cdot10^{-16}, singola 1,19⋅10−71{,}19\cdot10^{-7}. Dimostrazione: passo βe+1−t\beta^{e+1-t}, errore ≤\le mezzo passo, ∣x∣≥βe|x|\ge\beta^e. In F(2,3,−1,2)F(2,3,-1,2): fl(2,7)=2,5\mathrm{fl}(2{,}7)=2{,}5; 1+0,1→11+0{,}1\to1 (assorbimento); 7,67{,}6 overflow.

Operazioni: fl(a∘b)=(a∘b)(1+δ)\mathrm{fl}(a\circ b)=(a\circ b)(1+\delta), ∣δ∣≤u|\delta|\le u. Somma non associativa: (1016+1)−1016=0(10^{16}+1)-10^{16}=0; 0,1+0,2≠0,30{,}1+0{,}2\ne0{,}3; mai == tra reali. In F(10,4)F(10,4): 1234+0,4+0,41234+0{,}4+0{,}4 vale 12341234 da sinistra e 12351235 sommando prima i piccoli.

Cancellazione: errore relativo di a~−b~\tilde a-\tilde b ≤∣a∣+∣b∣∣a−b∣max⁡(∣εa∣,∣εb∣)\le\frac{|a|+|b|}{|a-b|}\max(|\varepsilon_a|,|\varepsilon_b|), enorme se a≈ba\approx b. Si riformula:

  • 1001−1000=11001+1000\sqrt{1001}-\sqrt{1000}=\frac{1}{\sqrt{1001}+\sqrt{1000}}: con 55 cifre 0,0160{,}016 (errore 1,2%1{,}2\%) contro 0,0158070{,}015807;
  • 1−cos⁡xx2=2sin⁡2(x/2)x2\frac{1-\cos x}{x^2}=\frac{2\sin^2(x/2)}{x^2} (a x=10−8x=10^{-8} la prima dà 00, la seconda 0,50{,}5);
  • radici di ax2+bx+cax^2+bx+c: prima quella senza cancellazione, poi x2=c/(ax1)x_2=c/(a x_1).

Passaggi principali.

  • Tabella di F(2,3,−1,2)F(2,3,-1,2): e=−1e=-1: 0,5 … 0,8750{,}5\ \dots\ 0{,}875 (passo 0,1250{,}125); e=0e=0: 1 … 1,751\ \dots\ 1{,}75 (passo 0,250{,}25); e=1e=1: 2 … 3,52\ \dots\ 3{,}5 (passo 0,50{,}5); e=2e=2: 4,5,6,74,5,6,7 (passo 11). Errore relativo di fl(5,4)=5\mathrm{fl}(5{,}4)=5: 0,4/5,4≈0,074≤u=0,1250{,}4/5{,}4\approx0{,}074\le u=0{,}125.
  • Radici di 1001−1000\sqrt{1001}-\sqrt{1000} a 55 cifre: 31,639−31,623=0,01631{,}639-31{,}623=0{,}016 (una cifra sola); amplificazione massima 63,2620,016≈3950\frac{63{,}262}{0{,}016}\approx3950. Forma stabile: 163,262=0,015807\frac1{63{,}262}=0{,}015807.
  • x2−108x+1=0x^2-10^8x+1=0 in doppia: b2−4c\sqrt{b^2-4c} dà x1=108x_1=10^8; la formula diretta per x2x_2 dà 7,45⋅10−97{,}45\cdot10^{-9} (errore 25%25\%), il prodotto c/x1c/x_1 dà 10−810^{-8}.
  • Codice: np.finfo(float).eps, np.spacing(x); in MATLAB eps, eps(x), realmax, realmin.
  • Cifre corrette: π≈3,14\pi\approx3{,}14 ha Ea=0,00159E_a=0{,}00159 ed Er=5,07⋅10−4E_r=5{,}07\cdot10^{-4}, cioè circa 33 cifre. Interi a 1616 bit: [−32768, 32767][-32768,\,32767].
  • Radici senza cancellazione: si calcola prima la radice in cui −b-b e ∓b2−4ac\mp\sqrt{b^2-4ac} hanno lo stesso segno, x1=−b−sgn⁡(b)b2−4ac2ax_1=\frac{-b-\operatorname{sgn}(b)\sqrt{b^2-4ac}}{2a}, poi x2=ca x1x_2=\frac{c}{a\,x_1}.
  • Doppia precisione: vicino a 101610^{16} il passo tra numeri di macchina è 22, vicino a 10810^8 è 1,49⋅10−81{,}49\cdot10^{-8}.

Regole. Si sommano prima i termini piccoli; se b2≤a≤2b\frac b2\le a\le2b la differenza di due numeri di macchina è esatta; si confronta con ∣a−b∣≤tol max⁡(∣a∣,∣b∣)|a-b|\le\text{tol}\,\max(|a|,|b|); fl\mathrm{fl} è esatto solo se il numero è già di macchina; overflow se ∣x∣|x| supera xmax⁡x_{\max}, underflow sotto xmin⁡x_{\min}.

Errori tipici: confondere uu e εM\varepsilon_M; dire che l'errore assoluto è ≤u\le u; incolpare la sottrazione (è esatta).

Esercizi su questo argomento

Teoria collegata