L’aritmetica del Matlab. Abbiamo introdotto il concetto di aritmetica finita in astratto insieme alle nozioni di numero floating, precisione e operazione floating. Poiché molte sperimentazioni numeriche verranno eseguite in ambiente Matlab, mostriamo in quale modo in questo ambiente vengono costruiti i numeri floating. Per costruire ognuno di questi numeri il Matlab si serve di 64 bit, ognuno dei quali può essere riempito solo da zero o uno. Lo zero che non ha rappresentazione floating point, ma che comunque è un numero floating dell’aritmetica, viene individuato con tutti bit nulli. Per ogni altro numero il primo bit è dedicato al segno, i successivi undici bit sono destinati a formare l’esponente e i restanti 52 definiscono la mantissa. Se il primo bit è zero, il segno del numero è positivo, se è uno il segno è negativo. Gli undici bit dedicati all’esponente permettono di calcolare BIT × 210 + BIT × 29 + BIT × 28 +….. BIT × 21 + BIT × 20. Ma i bit non possono essere tutti zero né possono essere tutti uno, per ragioni che saranno chiare in seguito. Allora il più piccolo esponente si ottiene con i primi dieci bit zero e l’ultimo bit 1. Il valore è uno. Il più grande esponente si realizza con i primi dieci bit uno e l’ultimo bit zero. Il valore è 1 × 210 + 1 × 29 + 1 × 28 +….. 1 × 21 + 0 × 20 = 2046. Ma allora dove sono gli esponenti negativi ?. In realtà questa è la realizzazione fisica dell’esponente. Quello che si vuole denotare si trova con il complemento a due. Vale a dire da questo esponente va sottratto 1022. In conseguenza il più piccolo esponente è L = 1021 e il più grande esponente è U = 1024. Per quanto riguarda la mantissa, abbiamo a disposizione 52 bit. Ma sappiamo che le mantisse standard hanno prima cifra non nulla. In questo contesto ( base 2) la prima cifra non nulla è necessariamente uno, e pertanto, può essere sottinteso. Quindi le cifre consentite alla mantissa sono 53, e una volta riempiti i bit, il valore della mantissa è mantisssa = 1/2 + BIT × (1/22) + BIT × (1/23) +……BIT × (1/253) La più piccola mantissa è quindi .1 = ½ e la più grande mantissa è con 53 uno dopo il punto, cioè 1253. Ma l’aritmetica è troncata o arrotondata ?. In alcune circostanze si esegue un troncamento e in altre un arrotondamento. Rinunciamo a illustrare queste scelte, ma ci limitiamo a dire che a causa di questa aritmetica ibrida la precisione denotata con eps, è eps = 2-52, cioè quella dell’aritmetica troncata. Le costanti realmax e realmin. Se la più grande mantissa è 1 -253, il più grande numero floating è (1-253)21024 ≈ 1.977 ×10 308 e viene denotato con realmax. La più piccola mantissa è ½ e il più piccolo numero floating positivo diventa 1/2×2-1021 = 2-1022 ≈ 2.2551 × 10-308. Quindi l’intervallo *realmin realmax+ è l’insieme dei numeri positivi rappresentabili in Matlab, mentre l’intervallo [-realma –realmin] è l’insieme dei numeri negativi rappresentabili. La costanti inf Dopo realmax si realizza over flow e per il matlab si tratta di inf.. Essi viene codificato mettendo 0 al primo bit e riepiendo con uno ciascuno degli undici bit dell’esponente. I 52 bit per la mantissa sono tutti zero. Questo spiega perché non è possibile usare undici bit uno per formare un esponente di un numero floating. E possibile far precedere inf da -, per identificare –inf. Esso consiste di 12 bit uno e i restanti 52 zero. La costante nan. Se si eseguono operazioni che danno luogo a forme indeterminate, la risposta è indeterminata che per il matlab è la costantee nan. Questa è codificata con 13 bit uguali a uno e i restanti 51 bit uguali a zero. La precisione Come già riferito la precisione matlab è eps = 2-52 ≈ = 2.2204 × 10-16. Questo vuol dire che la funzione floating commette su un numero rappresentabile un errore relativo tale da conservare circa 16 cifre decimali in base 10. Risulta Fl(x) = x( 1 + ε), | ε | < eps L’errore eps non è mai raggiunto e poiché a volta l’aritmetica arrotonda invece di troncare, capita che l’errore può essere inferiore a ε/2. Numeri denormalizzati Sotto realmin il Matlab non mette automaticamente zero, ma alcuni numeri non in rappresentazione floating point standard, detti denormalizzati. Quando si scende sotto una certa soglia il suo under flow è lo zero. Esempi. Vediamo come fisicamente si realizza il numero in base 10, x = 12. In base 2, x ha mantissa .11 = ½ + ¼ = .75 ed esponente 4. Infatti 16 × .75 = 12. Quindi il primo bit è zero perché si tratta di un numero positivo. All’esponente 4 sommiamo 1022 ottenendo 1026. Trasformiamo 1026 in base 2 , ottenendo 10000000010. Questi sono gli undici bit dell’esponente. I 52 bit della mantissa sono riempiti il primo con uno e i restanti con zero ( il primo bit uno è sottinteso). In questo esempio sono stati utilizzati tutti gli undici bit per l’esponente. Nel caso in cui sommando 1022 all’esponente e trasformando in base 2 si ottiene un numero con totale cifre inferiore a undici, si fa precedere il numero di tanti zeri fino a riempire hli undici bit. Per esempio, sia x = -8/25 = .32. I)n base 2, .32= -.01000001…., e in floating point , x = (-.100001..,1)2. All’esponente va sommato 1022 ottenendo 1021 che in base 2 diventa 1111111101. Il primo bit è 1 ( numero negativo) e occorre far precedere la sequenza di 10 bit trovata per 1021 da un bit 0 per riempire blt undici bit dedicati all’esponente. Poi la mantissa fisica comincia con 4 zeri ( la prima cifra uno è sottintesa) seguita da 1 ed altre cifre troncato o arrotondando sull’ultima 52esima cifra.