ROTFC (alias La matematica dei Geeks #3)

Single a = 14.56F;
Single b = 5.02F;
Single sum = 19.58F;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(a + b);
Console.WriteLine(sum == (a + b)); //False
Console.WriteLine(sum.Equals(a + b)); //True
Console.ReadLine();

Single a1 = 14.56F;
Single b1 = 254.02F;
Single sum1 = 268.58F;
Console.WriteLine(a1);
Console.WriteLine(b1);
Console.WriteLine(a1 + b1);
Console.WriteLine(sum1 == (a1 + b1)); //False
Console.WriteLine(sum1.Equals(a1 + b1)); //False
Console.ReadLine();

Propongo una sessione per i prossimi Community Days: "Le addizioni".

 

Update: dimenticavo un tassello...

Print | posted @ mercoledì 11 giugno 2008 15:38

Comments on this entry:

Gravatar # re: ROTFC (alias La matematica dei Geeks #3)
by Marcello Cantelmo at 11/06/2008 17:47

ciao Mario,

Dim a As Single = 14.56F
Dim b As Single = 254.02F
Dim sum As Single = 268.58F
'<<<
Dim tempSUM As Single = (a + b)

qui da me tempSUM è pari a: 268.580017 :-o

cerco di capirne qualcosa in più anch'io ;-)

Marcello Cantelmo
Gravatar # re: ROTFC (alias La matematica dei Geeks #3)
by Raffaele Rialdi at 11/06/2008 21:04

Mario, è così che funziona lo standard IEEE754.
I numeri che ottieni sono la più fedele rappresentazione del numero in potenze di due e perciò è corretto.

I floating point *NON* vanno usati per rappresentare numeri "precisi" come dati finanziari, quantità fisiche precise (vedi i dati di magazzino) etc. etc.
Quello che tu vuoi è una rappresentazione "fotografica" del numero cioè il formato BCD. Cioè ti servono i decimal.

BTW lo stesso si applica a C++, SQL Server, etc. etc.
BTW2 C++ non ha il decimal nativo e infatti in molti devono ricorrere a librerie di terze parti.
Comments have been closed on this topic.