Teoria: Aritmetica di macchina - floating point, precisione di macchina e cancellazioneUn calcolatore rappresenta solo un insieme finito di numeri F(β,t,L,U); ogni numero reale viene arrotondato con errore relativo al più u = ½β^(1−t) (u ≈ 1,1·10⁻¹⁶ in doppia precisione) e ogni operazione è esatta più un errore (1+δ), |δ| ≤ u. Conseguenze: overflow e underflow, somma non associativa, assorbimento, e soprattutto la cancellazione numerica nella differenza di numeri quasi uguali, che si evita riformulando l'espressione.Aritmetica di macchina - floating point, precisione di macchina e cancellazione →; per il limite si usa 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 →.
Testo
Si vuole calcolare f(x)=x21−cosx per x piccolo con una macchina che arrotonda ogni risultato a 5 cifre significative decimali.
- (a) Calcolare f(x) con la formula diretta per x=0,1, 0,01, 0,001 e confrontare con il valore esatto.
- (b) Riscrivere f senza sottrazione e ripetere il calcolo.
- (c) Dedurre dallo sviluppo di Mac-Laurin il valore esatto di f per x→0 e il suo comportamento per x piccolo.
- (d) Domanda teorica: quante cifre significative si perdono nel passaggio 1−cosx per x=0,01?
Soluzione
Per ogni x si calcola cosx, lo si arrotonda a 5 cifre, si sottrae da 1, si divide per x2.
| x |
cosx esatto |
cosx a 5 cifre |
1−cosx |
f(x) calcolato |
f(x) esatto |
| 0,1 |
0,9950042 |
0,99500 |
0,00500 |
0,50000 |
0,499583 |
| 0,01 |
0,99995000 |
0,99995 |
0,00005 |
0,50000 |
0,499996 |
| 0,001 |
0,9999995 |
1,0000 |
0 |
0 |
0,49999996 |
(Per x=0,1: 0,010,00500=0,500. Per x=0,01: 0,00010,00005=0,5. Per x=0,001: il coseno 0,9999995 a 5 cifre significative diventa 1,0000 e la differenza è 0.)
L'errore relativo è 8⋅10−4 per x=0,1 e 8⋅10−6 per x=0,01 (qui il risultato 0,5 ha una sola cifra significativa, che per fortuna è giusta: la differenza 1−cosx=0,00005 non porta informazione oltre la prima cifra), e arriva al 100% per x=0,001: tutte le cifre sono perse.
L'identità 1−cosx=2sin22x (dalla formula di bisezione del coseno) dà
f(x)=x22sin2(x/2).
Qui non ci sono differenze di numeri vicini. Per x=0,1: sin0,05=0,049979→0,049979; quadrato 0,0024979; doppio 0,0049958; diviso 0,01: 0,49958 ✓ (esatto 0,499583).
Per x=0,01: sin0,005=0,0049999792→0,0050000; quadrato 0,000025000; doppio 0,000050000; diviso 0,0001: 0,50000 (esatto 0,499996: 5 cifre corrette).
Per x=0,001: sin0,0005→0,00050000; quadrato 2,5000⋅10−7; doppio 5,0000⋅10−7; diviso 10−6: 0,50000 ✓.
(c) Valore esatto
Da cosx=1−2x2+24x4−…:
1−cosx=2x2−24x4+…⟹f(x)=21−24x2+⋯→21.
Controllo: per x=0,1, 21−240,01=0,49958333 ✓.
(d) Cifre perse
Per x=0,01: cosx=0,99995000… ha 5 cifre significative, ma la differenza 1−cosx=0,00005 ne ha una sola (5). Il fattore di amplificazione ∣1−cosx∣∣1∣+∣cosx∣≈5⋅10−52=4⋅104 dice che si perdono circa 4 cifre (su 5).
Risultato. La formula diretta fallisce per x=0,001 (dà 0 invece di 0,5); la formula x22sin2(x/2) dà 0,50000, con limite esatto 21.
Errori tipici
- Pensare che aumentando le cifre del coseno il problema sparisca: lo sposta soltanto (a x=10−8 in doppia precisione si ricade nello stesso caso).
- Calcolare a mano cosx con più cifre del dovuto e poi "arrotondare" la differenza: l'arrotondamento va fatto sul coseno, prima della sottrazione.
Versione ripasso
(a) Formula diretta, 5 cifre (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 → per il limite):
| x |
cosx a 5 cifre |
1−cosx |
f calcolato |
f esatto |
| 0,1 |
0,99500 |
0,00500 |
0,50000 |
0,499583 |
| 0,01 |
0,99995 |
0,00005 |
0,5 |
0,499996 |
| 0,001 |
1,0000 |
0 |
0 |
0,49999996 |
Per x=0,001 errore relativo 100%.
(b) 1−cosx=2sin22x, quindi f=x22sin2(x/2).
- x=0,1: sin0,05=0,049979, quadrato 0,0024979, doppio 0,0049958, diviso 0,01: 0,49958.
- x=0,001: sin0,0005=0,00050000, quadrato 2,5⋅10−7, doppio 5⋅10−7: 0,50000.
(c) f(x)=21−24x2+⋯→21; per x=0,1: 0,49958333.
(d) A x=0,01: amplificazione 1−cosx1+∣cosx∣≈5⋅10−52=4⋅104, circa 4 cifre perse su 5.
Errori tipici: pensare che più cifre del coseno risolvano (si sposta il problema); arrotondare la differenza invece del coseno prima della sottrazione.