RAPPRESENTAZIONE DELL’INFORMAZIONE Internamente a un elaboratore, ogni informazione è rappresentata tramite sequenze di bit (cifre binarie) Una sequenza di bit non dice “che cosa” essa rappresenta Ad esempio, 01000001 può rappresentare: l’intero 65, il carattere ‘A’, il boolean ‘vero’, … … il valore di un segnale musicale, … il colore di un pixel sullo schermo... 1 INFORMAZIONI NUMERICHE Originariamente la rappresentazione binaria è stata utilizzata per la codifica dei numeri e dei caratteri Oggi si digitalizzano comunemente anche suoni, immagini, video e altre informazioni (informazioni multimediali) La rappresentazione delle informazioni numeriche è ovviamente di particolare rilevanza A titolo di esempio, nel corso ci concentreremo sulla rappresentazione dei numeri interi (senza o con segno) Dominio: N = {…,-2, -1, 0, 1, 2, …} 2 NUMERI NATURALI (interi senza segno) Dominio: N = { 0,1,2,3, …} Rappresentabili con diverse notazioni non posizionali ad esempio la notazione romana: I, II, III, IV, V, .... IX, X, XI… Risulta difficile l’utilizzo di regole generali per il calcolo posizionale 1, 2, .. 10, 11, ... 200, ... Risulta semplice l’individuazione di regole generali per il calcolo 3 NOTAZIONE POSIZIONALE Concetto di base di rappresentazione B Rappresentazione del numero come sequenza di simboli (cifre) appartenenti a un alfabeto di B simboli distinti ogni simbolo rappresenta un valore compreso fra 0 e B-1 Esempio di rappresentazione su N cifre: dn-1 … d2 d1 d0 4 NOTAZIONE POSIZIONALE Il valore di un numero espresso in questa notazione è ricavabile a partire dal valore rappresentato da ogni simbolo pesandolo in base alla posizione che occupa nella sequenza dn-1 … d2 d1 d0 Posizione n-1: pesa Bn-1 Posizione 1: pesa B1 Posizione 0: pesa B0 (unità) 5 NOTAZIONE POSIZIONALE In formula: dove n 1 v dk B k k 0 B = base ogni cifra dk rappresenta un valore fra 0 e B-1 Esempio (base B=4): 1 2 1 3 d3 d2 d1 d0 Valore = 1 * B3 + 2 * B2 + 1 * B1 + 3 * B0 = centotre 6 NOTAZIONE POSIZIONALE Quindi, una sequenza di cifre non è interpretabile se non si precisa la base in cui è espressa Esempi: Stringa “12” “12” “12” “12” Base quattro otto dieci sedici Alfabeto {0,1,2,3} {0,1,...,7} {0,1,...,9} {0,..,9, A,., F} Calcolo valore 4*1+2 8*1+2 10 * 1 + 2 16 * 1 + 2 Valore sei dieci dodici diciotto 7 NOTAZIONE POSIZIONALE Inversamente, ogni numero può essere espresso, in modo univoco, come sequenza di cifre in una qualunque base Esempi: Numero venti venti venti venti Base due otto dieci sedici Alfabeto Rappresentazione {0,1} “10100” {0,1,...,7} “24” {0,1,...,9} “20” {0,..,9, A,., F} “14” Non bisogna confondere un numero con una sua RAPPRESENTAZIONE! 8 Rappresentazione in base p Metodo posizionale: ogni cifra ha un peso Esempio: 123 = 100 +20 +3 • Di solito noi usiamo la base decimale • Un numero generico di m cifre è rappresentato in base p dalla sequenza: an, an-1, an-2,..., a0 an : cifra più significativa a0 : cifra meno significativa n = m-1 ai {0, 1, ..., p-1} Rappresentazione in base p • Un numero naturale N, composto da m cifre, in base p, si esprime come: N p an p an1 p n n 1 n ... a1 p a0 p ai p i 1 0 i 0 • Esempio in base decimale (p=10): 58710 = 7·100 + 8·101 + 5·102 • Posso rappresentare i numeri nell’intervallo discreto: [0 , pm - 1] Rappresentazione in base due • Base binaria: p=2; cifre ai {0, 1} chiamate bit (binary digit) • Otto bit sono chiamati byte Esempio, con m=5: 110112 = (1·24+1·23+0·22+1·21+1·20)10 = 2710 • Posso rappresentare i numeri nell’intervallo discreto: [0 , 2m -1] • Esempio con m=8: rappresento numeri binari: [000000002 , 111111112], ovvero: [0 , 255] NUMERI NATURALI: valori rappresentabili Con N bit, si possono fare 2N combinazioni Si rappresentano così i numeri da 0 a 2N-1 Esempi con 8 bit, [ 0 …. 255 ] In C: unsigned char = byte con 16 bit, [ 0 …. 65.535 ] In C: unsigned short int (su alcuni compilatori) In C: unsigned int (su alcuni compilatori) con 32 bit, [ 0 …. 4.294.967.295 ] In C: unsigned int (su alcuni compilatori) In C: unsigned long int (su molti compilatori) 12 Conversioni di base • Per convertire da base due a base 10: – Usare la sommatoria illustrata nella slide precedente • Per convertire da base dieci a base due: – Metodo delle divisioni successive: Metodo delle divisioni successive Esempio: Esprimere in base 2 il numero naturale 2710 operazione quoziente resto 27:2 13 1 a0 13:2 6 1 a1 6:2 3 0 a2 3:2 1 1 a3 1:2 0 1 a4 2710= (11011) 2 Operazioni sui Numeri Binari: Addizione • Le cifre sono 0 e 1 ed il riporto (carry) può essere solo 1 Riporto precedente Somma Risultato Riporto 0 0+0 0 0 0 0+1 1+0 1 0 0 1+1 0 1 1 0+0 1 0 1 0+1 1+0 0 1 1 1+1 1 1 Addizione e riporto (carry) • Esempio: 1 riporto 0101 + (510) 1001 = (910) -----1110 (1410) 111 riporti 1111 + 1010 = ------carry 11001 (1510) (1010) (2510 se uso 5 bit; 910 se considero 4 bit: OVERFLOW) Sottrazione • Le cifre sono 0 e 1 ed il prestito può essere solo 1 Prestito precedente differenza Risultato Prestito 0 0-0 0 0 0 1-0 1 0 0 1-1 0 0 0 0-1 1 1 1 0-0 1 1 1 1-0 0 0 1 1-1 1 1 1 0-1 0 1 Basi ottale ed esadecimale • Base ottale: p=8; ai {0, 1, 2, 3, 4, 5, 6, 7} – Esempio: 2348 = (2·82+3·81+4·80)10 = 15610 • Base esadecimale: p=16; ai {0, 1, 2, …, 9, A, B, C, D, E, F} – Esempio: B7F16 = (11·162+7·161+15·160)10 = 294310 – Notare: “11” al posto di “B” e “15” al posto di “F”, i loro equivalenti in base dieci • Conversione dalla base 2 alla base 8 o 16: si considerano gruppi di tre o 4 cifre binarie • Es: 001 010 110 111 si traduce ogni tripla nella corrispondente cifra ottale ERRORI (primissimo assaggio ) Esempio (supponendo di avere solo 7 bit per la rappresentazione) 60 + 99 = ----135 0111100 1100011 -------10011111 Errore! Massimo numero rappresentabile: 27-1 cioè 127 • Questo errore si chiama overflow • Può capitare sommando due numeri dello stesso segno il cui risultato non sia rappresentabile utilizzando il numero massimo di bit designati 19 ESERCIZIO RAPPRESENTAZIONE Un elaboratore rappresenta numeri interi su 8 bit dei quali 7 sono dedicati alla rappresentazione del modulo del numero e uno al suo segno. Indicare come viene svolta la seguente operazione aritmetica: 59 – 27 in codifica binaria 20 ESERCIZIO RAPPRESENTAZIONE Soluzione 59 0 0111011 -27 1 0011011 Tra i (moduli dei) due numeri si esegue una sottrazione: 0111011 - 0011011 ------0100000 che vale 32 in base 10 21 DIFFERENZE TRA NUMERI BINARI Che cosa avremmo dovuto fare se avessimo avuto 27-59 ? Avremmo dovuto invertire i due numeri, calcolare il risultato, e poi ricordarci di mettere a 1 il bit rappresentante il segno Per ovviare a tale problema, si usa la notazione in “complemento a 2” (vedi nel seguito), che permette di eseguire tutte le differenze tramite semplici somme 22 INFORMAZIONI NUMERICHE La rappresentazione delle informazioni numeriche è di particolare rilevanza Abbiamo già discusso i numeri naturali (interi senza segno) N = { 0,1,2,3, …} Come rappresentare invece i numeri interi (con segno)? Z = { -x, xN - {0}} N 23 NUMERI INTERI (con segno) Dominio: Z = { …, -2,-1,0,1,2,3, … } Rappresentare gli interi in un elaboratore pone alcune problematiche: • come rappresentare il “segno meno”? • possibilmente, come rendere semplice l’esecuzione delle operazioni aritmetiche? Magari riutilizzando gli stessi algoritmi e gli stessi circuiti già usati per i numeri interi senza segno 24 NUMERI INTERI (con segno) Due possibilità: rappresentazione in modulo e segno semplice e intuitiva ma inefficiente e complessa nella gestione delle operazioni non molto usata in pratica rappresentazione in complemento a due meno intuitiva, costruita “ad hoc” ma efficiente e capace di rendere semplice la gestione delle operazioni largamente usata nelle architetture reali di CPU 25 NUMERI INTERI (con segno) Rappresentazione in modulo e segno 1 bit per rappresentare il segno 0 + 1 - (N-1) bit per il valore assoluto Esempi (su 8 bit, Most Significant Bit –MSB- rappresenta il segno): + 5 = 0 0000101 - 36 = 1 0100100 26 NUMERI INTERI (con segno) Rappresentazione in modulo e segno Due difetti principali: occorrono algoritmi speciali per fare le operazioni Ad esempio: (+5) + (-5) = -10 ??? +5 -5 --0 0 0000101 1 0000101 ---------1 0001010 se si adottano le usuali regole, non è verificata la proprietà X + (-X) = 0 occorrono regole (e quindi circuiti) ad hoc due diverse rappresentazioni per lo zero + 0 = 00000000 - 0 = 10000000 27 NUMERI INTERI (con segno) Rappresentazione in complemento a due si vogliono poter usare le regole standard per fare le operazioni in particolare, si vuole che X + (-X) = 0 la rappresentazione dello zero sia unica anche a prezzo di una notazione più complessa, meno intuitiva, e magari non (completamente) posizionale 28 NUMERI INTERI (con segno) Rappresentazione in complemento a due si vogliono poter usare le regole standard per fare le operazioni in particolare, si vuole che X + (-X) = 0 la rappresentazione dello zero sia unica anche a prezzo di una notazione più complessa, meno intuitiva Rappresentazioni dei Numeri • Il bit più significativo rappresenta il segno del numero: 0 per positivi, 1 per negativi • La rappresentazione di un numero positivo si ottiene codificando il valore assoluto del numero con i bit restanti • La rappresentazione di un numero negativo si ottiene in tre passi: – Si rappresenta in complemento a due il numero positivo con lo stesso valore assoluto del numero negativo da codificare – Si invertono tutti i bit – Si somma 1 al risultato ottenuto al passo precedente Quindi: • per calcolare il numero negativo -|v| occorre: • prima invertire tutti i bit della rappresenta-zione di |v| poi aggiungere 1 al risultato Esempio • Esempio con 4 bit a disposizione • +5 -> 0101 • -5 -> : – La rappresentazione del complemento a due di +5 è 0101 – Invertendo tutti i bit si ottiene 1010 – Sommando 1 si ottiene 1011 -> -5 Ottenere un numero con segno data la rappresentazione in CPL2 • Se il primo bit è 0 il numero è positivo: per calcolarne il valore assoluto si esegue la conversione da binario a decimale • Se il primo bit è 1 il numero è negativo: – Si ignora il primo bit – Si invertono i bit restanti – Si converte da binario a decimale – Si somma 1 al numero così ottenuto per ottenere il valore assoluto del numero negativo – Es. 1011. si esclude il primo bit. Invertendo 011 si ottiene 100 che è la codifica di 4, si aggiunge 1, quindi si ottiene il valore assoluto 5, il risultato è -5 Complemento a due (CPL2) • Usando m bit: (-N)CPL2 = (2m - N10)2 • Esempio (m=3): (-N)CPL2 = (23 - N10)2 Num. intero base 10 Trasformazione Num. intero, base 2, CPL2, m=3 -4 8-4=4 410 = 100 -3 8-3=5 510 = 101 -2 8-2=6 610 = 110 -1 8-1=7 710 = 111 0 nessuna 010 = 000 1 nessuna 110 = 001 2 nessuna 210 = 010 3 nessuna 310 = 011 Complemento a due (CPL2) • Posso rappresentare i numeri nell’intervallo discreto: [-2m-1 , 2m-1 - 1] – Asimmetria tra negativi e positivi – Esempio (m=8): [-128, +127], perché -27 = -128 e 27 - 1 = +127 • Tutti i numeri negativi cominciano con il bit più significativo posto a “1”, mentre tutti i positivi e lo zero iniziano con uno “0” Somma e sottrazione in CPL2 • Somma: come per i naturali • Sottrazione: N1 - N2 = N1 + (-N2)CPL2 • Carry: – Il carry non viene considerato! • Overflow: – Se, sommando due interi di m bit dotati di segno concorde, ottengo un risultato di segno discorde (sempre considerando m bit), allora si ha un overflow (il risultato non è codificabile su m bit) e l’operazione è errata – L’overflow non può verificarsi se gli operandi sono di segno discorde Rappresentazione in eccesso Nella notazione in eccesso una parte di numerali disponibili si usa per rappresentare i numeri negativi e la restante per rappresentare lo zero e I numeri positivi. Si trasla l’origine dell’asse che rappresenta i numeri naturali e si usano I numerali che precedono l’origine cosi’ determinata per rappresentare I numeri negativi Se n=8 si possono rappresentare tutti I numeri da 0 a 255. Con N=127 ho due intervalli da 0 a 126 che si usano per rappresentare I numeri negativi da -127 a 1, il numerale 127 che rappresenta lo 0 e I restantipositivi da 1 a128 Rappresentazione dei Numeri: NUMERI RAZIONALI Ovviamente rappresentazione posizionale vale anche per numeri “con virgola”, avendo l’accortezza di pesare le cifre a dx della virgola con potenze negative della base e via via decerescenti mano a mano che ci si sposta verso destra. Un numero a con N cifre a destra della virgola ed M a sinistra vale: M 1 a ci * bi i N Quindi, come si converte un numero razionale da decimale a binario? Rappresentazione in virgola mobile (mantissa ed esponente), utilizzando base 2 Standard IEEE 754 (rappresentazione float a 32 bit): - Bit più significativo per segno mantissa (0 per positivi, 1 per negativi) - 8 bit per l’esponente (notazione in complemento a 2) - Ultimi 23 bit per mantissa in forma normale 38 Rappresentazione dei Numeri: NUMERI RAZIONALI • zero si rappresenta ponendo a 0 tutti i bit di mantissa ed esponente • +∞ e –∞ si possono rappresentare ponendo a 1 tutti i bit dell’esponente e a 0 tutti i bit della mantissa • Not a Number (NaN) ponendo a 1 tutti i bit dell’esponente e la mantissa diversa da 0 Nel caso di doppia precisione – double: 11 bit per esponente, 52 per mantissa Valori massimo e minimo rappresentabili Interi senza segno Interi con segno Interi in complemento a 2 Reali in sing. prec. (modulo) Reali in doppia prec. (modulo) 0 -2147483647 -2147483648 1.401298*10-45 4.940656*10-324 4294967295 2147483647 2147483647 3.402823*1038 1.797693*10308 39 Rappresentazione dei Numeri: NUMERI RAZIONALI Es: 22,75 1. Si trasforma da decimale a binario conservando la virgola 22.75=10110.11 (la parte decimale 0.75=0.5+0.25 corrisponde alle potenze di 2-1 e 2-2) 2. Si trasla la virgola di tanti posti a sx quanti ne servono a far diventare il numero minore di 2(cioè a lasciare la virgola a dx del bit più significativo): 1.011011 3. Si moltiplica il numero per una potenza di due pari al numero di posti di cui è stata spostata la virgola: 24, la cui rappresentazione in eccesso a 127 è 4+127=131 =10000011 4. Si scrive il bit di segno (0) quindi i primi 8 bit che rappresentano l’esponente di 2 seguiti dalla parte frazionaria della mantissa (23 bit): 0 10000011 01101100000000000000000 N.B a causa del numero limitato di cifre a disposizione, un numero si puo’ rappresentare esattamente in un calcoltaore solo se la sua parte frazionaria è esprimibile come somma di un numero limitato di potenze di 40 2 altrimenti lo si approssima a quello ad esso più vicino Errori di Approssimazione: OVERFLOW • Se si sommano due numeri positivi tali che il risultato sia maggiore del massimo numero positivo rappresentabile con i bit fissati (lo stesso per somma di due negativi) • Basta guardare il bit di segno del risultato: se 0 (1) e i numeri sono entrambi negativi (positivi) overflow 41 ERRORI NELLE OPERAZIONI Attenzione ai casi in cui venga invaso il bit più significativo (bit di segno) Esempio 60 + 75 = ----135 00111100 01100011 -------10011111 Errore! Si è invaso il bit di segno, il risultato è negativo! Questo errore si chiama invasione del bit di segno; è una forma di overflow Può accadere solo sommando due numeri dello stesso segno, con modulo sufficientemente grande 42 Errori di Approssimazione: ERRORI DI ARROTONDAMENTO e UNDERFLOW Tutti i numeri non interi si approssimano al numero razionale più vicino con rappresentazione finita (pensare a ma anche a 0.1) Precisione dell’ordine di 2n, dove n è il numero di bit dedicati alla mantissa Due numeri che differiscono per meno della precisione sono considerati uguali => errore di arrotondamento Se un numero è più piccolo della precisione, allora viene approssimato con 0 => errore di underflow 43 PROPAGAZIONE degli ERRORI Propagazione “catastrofica” in alcuni algoritmi quando operandi (numeri razionali) molto diversi o molto simili 1) Molto diversi: il più piccolo dei due operandi perde precisione a causa spostamento mantissa (necessario per svolgere operazione: stessa mantissa del più grande) Esempio: se a sufficientemente grande e b sufficientemente piccolo a+b=a (chi propone un esempio concreto in rappres. IEEE754?) 44 PROPAGAZIONE degli ERRORI a= 68833152 b= 2309657318129664 a= 0 10011001 0000011010010011110000 b= 0 10110010 0000011010010011110000 Per eseguire la somma devo incolonnare i numeri, quindi a deve essere espresso con lo stesso esponente di 2 di b. L’esponente di a è 26 quello di b 51. La differenza tra questi numeri è 25. La mantissa di a si dovrebbe riscrivere spostando le cifre di altrettante posizioni verso destra. Poichè il numero massimo di cifre per la mantissa è 23, il risultato è che la mantissa sarà rappresentata come una sequenza di 0 0 10110010 00000000000000000000000 + .... 0 10110010 0000011010010011110000 = Quindi un’assurdità! 45 PROPAGAZIONE degli ERRORI Propagazione “catastrofica” in alcuni algoritmi quando operandi (numeri razionali) molto diversi o molto simili 2) Molto simili: differenza fra due numeri molto vicini Esempio (in base 10 per semplificare; mantissa con 3 cifre significative dopo virgola): a = 1.000x103; b = 999.8x100 a – b = (1.000x103) – (0.999x103) = 1.000x100, che è piuttosto diverso da 0.2! Nota che diversi algoritmi possono produrre errori molto differenti. Ad esempio (x = 3.451x100, y = 3.450x100): x2 – y2 = 1.190x101 – 1.190x101 = 0!!! x2 – y2 = (x + y) (x - y) = (6.901x100) (1.000x10-3) = 6.901x10-3 46 Rapida Nota sulla Rappresentazione dei Caratteri Ad esempio, un tipo fondamentale di dato da rappresentare è costituito dai singoli caratteri Idea base: associare a ciascun carattere un numero intero (codice) in modo convenzionale Codice standard ASCII (1968) ASCII definisce univocamente i primi 128 caratteri (7 bit – vedi tabella nel lucido seguente) I caratteri con codice superiore a 127 possono variare secondo la particolare codifica adottata (dipendenza da linguaggio naturale: ISO 8859-1 per alfabeto latino1, …) Visto che i caratteri hanno un codice intero, essi possono essere considerati un insieme ordinato (ad esempio: ‘g’ > ‘O’ perché 103 > 79) 47 Tabella ASCII standard 48 NUMERI E LORO RAPPRESENTAZIONE Internamente, un elaboratore adotta per i numeri interi una rappresentazione binaria (base B=2) Esternamente, le costanti numeriche che scriviamo nei programmi e i valori che stampiamo a video/leggiamo da tastiera sono invece sequenze di caratteri ASCII Il passaggio dall'una all'altra forma richiede dunque un processo di conversione 49 Esempio: RAPPRESENTAZIONE INTERNA/ESTERNA Numero: centoventicinque Rappresentazione interna binaria (16 bit): 00000000 01111101 Rappresentazione esterna in base 10: occorre produrre la sequenza di caratteri ASCII '1', '2', '5' 00110001 00110010 00110101 vedi tabella ASCII 50 Esempio: RAPPRESENTAZIONE INTERNA/ESTERNA Rappresentazione esterna in base 10: È data la sequenza di caratteri ASCII '3', '1', '2', '5', '4' vedi tabella ASCII 00110011 00110001 00110010 00110101 00110100 Rappresentazione interna binaria (16 bit): 01111010 00010110 Numero: trentunomiladuecentocinquantaquattro 51 CONVERSIONE STRINGA/NUMERO Si applica la definizione: n 1 v dk B k 0 k le cifre dk sono note, il valore v va calcolato = d0 + B * ( d1 + B * ( d2 + B * ( d3 + ... ))) Ciò richiede la valutazione di un polinomio Metodo di Horner 52 CONVERSIONE NUMERO/STRINGA Problema: dato un numero, determinare la sua rappresentazione in una base data Soluzione (notazione posizionale): manipolare la formula per dedurre un algoritmo n 1 v d k Bk v è noto, le cifre dk vanno calcolate k 0 = d0 + B * ( d1 + B * ( d2 + B * ( d3 + ... ))) 53 CONVERSIONE NUMERO/STRINGA Per trovare le cifre bisogna calcolarle una per una, ossia bisogna trovare un modo per isolarne una dalle altre v = d0 + B * (…) Osservazione: d0 è la sola cifra non moltiplicata per B Conseguenza: d0 è ricavabile come v modulo B 54 CONVERSIONE NUMERO/STRINGA Algoritmo delle divisioni successive si divide v per B il resto costituisce la cifra meno significativa (d0) il quoziente serve a iterare il procedimento se tale quoziente è zero, l’algoritmo termina; se non lo è, lo si assume come nuovo valore v’, e si itera il procedimento con il valore v’ 55 CONVERSIONE NUMERO/STRINGA Esempi: Numero quattordici undici sessantatre sessantatre Base 4 2 10 16 Calcolo valore 14 / 4 = 3 con resto 2 3 / 4 = 0 con resto 3 11 / 2 = 5 con resto 1 5 / 2 = 2 con resto 1 2 / 2 = 1 con resto 0 1 / 2 = 0 con resto 1 63 / 10 = 6 con resto 3 6 / 10 = 0 con resto 6 63 / 16 = 3 con resto 15 3 / 16 = 0 con resto 3 Stringa “32” “1011” “63” “3F” 56 Esempio di PROPAGAZIONE in ALGORITMO ITERATIVO Attenzione ai problemi di arrotondamento in algoritmi iterativi, possibili anche in casi in cui non ce lo aspettiamo! Esempio di somma di N numeri naturali #include <stdio.h> #define N 10000000 main () { Quale risultato float s=0, x=7; dall’esecuzione? unsigned int i, is=0; ix=7; for (i=0; i<N; i++) { s += x; is += ix; } printf(“usando float: %.0f x %d = %.0f\n”, x, N, s); printf(“usando integer: %d x %d = %d\n”, ix, N, is); } 57 Esempio di PROPAGAZIONE in ALGORITMO ITERATIVO Errore già per i = 2396746, s = 16777222 Notazione IEEE 754; perdita della cifra più a destra dell’addendo 7 (approssimato a 6) Quindi un risultato finale più basso? NO, NEMMENO Situazione ancora più complessa: rappresentazione interna alla Floating Point Unit (FPU) a 80 bit, troncata quando si va in memoria centrale Ovviamente stesso problema di arrotondamento su somma di qualunque coppia di numeri che differiscono troppo fra loro E se avessimo a che fare con un ottimizzatore di codice 58 sufficientemente intelligente? COME RISOLVERE/ATTENUARE IL PROBLEMA? Algoritmi equivalenti alternativi che riducano la differenza tra i numeri da sommare Ad esempio: sommare prima m valori fra loro; poi sommare tra loro i k risultati (dove ovviamente k*m = n) Oppure somma di Kahan: float sum = 0., corr = 0., x = 7., tmp, y; int i; for (i=0; i<N; i++) { y = corr + x; tmp = sum + y; corr = (sum - tmp) + y; sum = tmp; } sum += corr; 59