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 12.38

Comments on this entry:

Gravatar # re: ROTFC (alias La matematica dei Geeks #3)
by spleen2060 at 11/06/2008 14.43

come mai il secondo
Console.WriteLine(sum.Equals(a + b)); //False

e' false?

mi sa che mi prendero' un RTFM

:-)
Gravatar # re: ROTFC (alias La matematica dei Geeks #3)
by Marcello Cantelmo at 11/06/2008 14.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 spleen2060 at 11/06/2008 14.53

forse l'ho scongiurato

decimal a = 14.06M;
decimal b = 254.02M;
decimal sum = 268.08M;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(a + b);
Console.WriteLine(sum == (a + b)); //TRue
Console.WriteLine(sum.Equals(a + b)); //TRue
// Console.ReadLine();

mentre questo, e il sapere come sono fatti all'interno i float, da implicitamente una risp ...

double a = 14.06F;
double b = 254.02F;
double sum = 268.08F;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(a + b);
Console.WriteLine(sum == (a + b)); //False
Console.WriteLine(sum.Equals(a + b)); //False


14,0600004196167
254,020004272461
268,080004692078
False
False
Gravatar # re: ROTFC (alias La matematica dei Geeks #3)
by Mario Duzioni at 11/06/2008 15.35

Ciao spleen, mi riferivo (come già in passato) proprio ad alcuni comportamenti matematici davvero poco chiari e assolutamente innaturali (vedi anche http://blogs.ugidotnet.org/duz/archive/2007/05/11/77956.aspx).

Un esempio in più?
Aggiungi:
Single c1 = a1 + b1;
in debug:
c1 = 268.580017
c1.ToString() == "268,58"

Chiamali gusti, chiamala anche ignoranza se vuoi, ma a me un comportamento simile non piace!
Gravatar # re: ROTFC (alias La matematica dei Geeks #3)
by marco at 11/06/2008 17.33

qualcuno mi spiega questo?

Console.WriteLine(sum == (a + b)); //False
Console.WriteLine(sum.Equals(a + b)); //True

Gravatar # re: ROTFC (alias La matematica dei Geeks #3)
by Raffaele Rialdi at 11/06/2008 18.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.