Nell’ultimo articolo abbiamo parlato della rappresentazione dei numeri interi e dei numeri con la virgola, i così detti floating point. Velocemente ricordiamo che in entrambi i casi è possibile incorrere in errori di overflow, mentre solo nel caso di utilizzo di floating point, si può incorrere in roundoff error e underflow. In realtà quando si utilizzano questo tipo di variabili, è possibile incorrere in altri problemi caratteristici, come la perdita di significatività o la catastrophic cancellation.
Analizziamo prima il caso della cancellazione catastrofica o carastrophic cancellation. Supponiamo di aver generato due valori non interi A e B molto simili tra loro, in realtà quasi uguali. I due valori infatti differiscono solo per una delle ultimissime cifre decimali. Ad esempio consideriamo A = xxxx.yyyyyyyyya e B = xxxx.yyyyyyyyyb. Andando a sottrarre questi due valori si otterrà un valore piccolissimo, approssimabile a zero. In questo modo avremo una perdita di significatività; infatti la perdita così repentina di informazioni è proprio detta catastrophic cancellation, intesa come cancellazione di cifre in un “colpo solo”. Si potrebbe pensare che nella realtà è difficile incorrere in questo tipo di errore, ma non è così! Già anche solo con l’utilizzo della formula statistica della varianza si rischia di incorrere in questo genere di errore.
Un’altra importante perdita di significatività avviene quando ad un numero molto grande A si somma un numero molto piccolo B. A causa del diverso allineamento di bit, cioè a causa della diversa lunghezza di mantissa e esponente utilizzati per rappresentare i due valori, avviene una grave perdita, poiché molte cifre dell’esponente vanno perse. Questo problema è riscontrabile soprattutto quando si eseguono somme con molti valori, alcuni però molto piccoli e altri molto grandi.
Ovviamente la ricerca di soluzioni a questi problemi è in continuo sviluppo, infatti i programmatori ed ingegneri nel tempo hanno proposto degli algoritmi che considerano termini di correzione con l’obiettivo di non perdere cifre e quindi informazioni preziose.
