Single d = 12.00f;
Single de = 12.23f;
Single r = 12.1f;
System.Console.WriteLine(d.ToString());
System.Console.WriteLine(de.ToString());
System.Console.WriteLine(r.ToString());
Ottenete esattamente i valori che vi interessano.
Provate però a fare il debug passo passo e fermarvi su ogni singolo valore:
"Single-precision numbers store an approximation of a real number
When you work with floating-point numbers, keep in mind that they do not always have a precise representation in memory"
Diamo due articoli come lettura su questo argomento:
http://msdn2.microsoft.com/en-us/library/system.single.aspx
http://msdn2.microsoft.com/en-us/library/system.single(VS.80).aspx
presi direttamente da MSDN, la Bibbia della programamzione in .NET
Ma come mai il computer si complica così la vita? Non potrebbe stare semplicemente a registrare il valore che io gli inserisco senza fare a modo suo per registrare? Beh la risposta risiede nel metodo di immagazzinamento a virgola mobile che viene usato nel compilatore in base 2.
Da Wikipedia:
floating-point
Un generico numero reale a può così essere rappresentato come (si indica con le lettere maiuscole il significato aritmetico dei campi):
In generale, questo tipo di numeri si comporta in modo molto simile ai numeri reali. Tuttavia ciò porta spesso i programmatori a non considerare l'importanza di un'adeguata analisi numerica risultati ottenuti. Ci sono molte incongruenze tra il comportamento dei numeri in virgola mobile in base 2 impiegati nell'informatica e quello dei numeri reali, anche in casi molto semplici (ad esempio la frazione 0,1 che non può essere rappresentata da nessun sistema binario in virgola mobile). Per questo non è un formato impiegato ad esempio in campo finanziario.
Le cause principali di errore nel calcolo in virgola mobile sono:
- arrotondamento
- numeri non rappresentabili (ad esempio 0,1);
- arrotondamento di operazioni aritmetiche (es.: 2/3=0,666667);
- assorbimento (es.: 1×1015 + 1 = 1×1015);
- cancellazione (es.: sottrazione di due numeri molto vicini);
- overflow (con segnalazione di risultato infinito);
- underflow (dà come risultato 0, un numero subnormale o il più piccolo numero rappresentabile);
- operazioni impossibili (es.: radice quadrata di un numero negativo diverso da zero, danno come risultato Nan);
- errori di arrotondamento: a differenza della virgola fissa, l'impiego del dithering sulla virgola mobile è pressoché impossibile.
La virgola mobile appare più appropriata quando si richiede una certa precisione relativa al valore. Quando è richiesta una precisione assoluta, la virgola fissa sembra una scelta migliore.
Riguardo all'errore di precisione che provoca l'utilizzo della virgola mobile, innanzitutto notiamo che se x è il numero rappresentato, cioè fl(x)=segno(x)(0.a1a2...an)bexp(p) allora si avrà 1/b*bexp(p)<=|x|
Nessun commento:
Posta un commento