Hi there,
any way to get around this math inaccuracy (using GNU/RTP):
If you do
double a = 1;
while (1)
{
cout << a << endl;
a -= 0.1;
}
You get
1
0.9
0.8
…
0.2
0.1
1.38778e-16
-0.1
-0.2
…
Thanks
Markus
Hi there,
any way to get around this math inaccuracy (using GNU/RTP):
If you do
double a = 1;
while (1)
{
cout << a << endl;
a -= 0.1;
}
You get
1
0.9
0.8
…
0.2
0.1
1.38778e-16
-0.1
-0.2
…
Thanks
Markus
Markus Loffler <loffler@ces.clemson.edu> wrote:
Hi there,
any way to get around this math inaccuracy (using GNU/RTP):
Probably not – this is inherent in how fractions are represent
in binary. This is one of the reasons why you should never test for
the result of a floating point operation being equal to some value.
It should always be ( abs(result - value) < delta).
If you do
double a = 1;
while (1)
{
cout << a << endl;
a -= 0.1;
}You get
1
0.9
0.8
…
0.2
0.1
1.38778e-16
I’ll bet you that all of the other values are off by equivalent ammounts
to the 0 case – but the output library rounds them nicely since they are
something like .100000000000000x, but when it is 0.000000000x, there is
no “leading” number to suggest where the precision should be.
So, are you worried about pretty output? In that case, use an
explicit output format for your number – it will then get rounded
as expected. If you are worried about the actual accuracy… see my
statement at the top. (That is, you can’t get it. Think about
“decimal” values – can you accurately represent the value of 1/3
in a finite length decimal? Of course not. Well, 0.1 is 1/10,
which can be accurately represent in a base 10 decimal, but can not
be accurately represented in base 2.)
-David
–
QNX Training Services
dagibbs@qnx.com
static const double step = 0.1;
static int ndx = 20;
while (ndx–) {
cout<<(ndx-9)*step<<end;
}
Markus Loffler wrote:
Hi there,
any way to get around this math inaccuracy (using GNU/RTP):If you do
double a = 1;
while (1)
{
cout << a << endl;
a -= 0.1;
}You get
1
0.9
0.8
…
0.2
0.1
1.38778e-16
-0.1
-0.2…
Thanks
Markus
“David Gibbs” <dagibbs@qnx.com> wrote in message
news:99djie$d3p$7@nntp.qnx.com…
Markus Loffler <> loffler@ces.clemson.edu> > wrote:
Hi there,
any way to get around this math inaccuracy (using GNU/RTP):Probably not – this is inherent in how fractions are represent
in binary. This is one of the reasons why you should never test for
the result of a floating point operation being equal to some value.
It should always be ( abs(result - value) < delta).
Hi David.
Do you mean (abs(result - value) < delta) or (fabs(result - value) < delta)?
How does this work?
Thanks
Augie
If you do
double a = 1;
while (1)
{
cout << a << endl;
a -= 0.1;
}You get
1
0.9
0.8
…
0.2
0.1
1.38778e-16I’ll bet you that all of the other values are off by equivalent ammounts
to the 0 case – but the output library rounds them nicely since they are
something like .100000000000000x, but when it is 0.000000000x, there is
no “leading” number to suggest where the precision should be.So, are you worried about pretty output? In that case, use an
explicit output format for your number – it will then get rounded
as expected. If you are worried about the actual accuracy… see my
statement at the top. (That is, you can’t get it. Think about
“decimal” values – can you accurately represent the value of 1/3
in a finite length decimal? Of course not. Well, 0.1 is 1/10,
which can be accurately represent in a base 10 decimal, but can not
be accurately represented in base 2.)-David
–
QNX Training Services
dagibbs@qnx.com
Augie Henriques <augiehenriques@hotmail.com> wrote:
“David Gibbs” <> dagibbs@qnx.com> > wrote in message
news:99djie$d3p$> 7@nntp.qnx.com> …
Markus Loffler <> loffler@ces.clemson.edu> > wrote:
Hi there,
any way to get around this math inaccuracy (using GNU/RTP):Probably not – this is inherent in how fractions are represent
in binary. This is one of the reasons why you should never test for
the result of a floating point operation being equal to some value.
It should always be ( abs(result - value) < delta).Hi David.
Do you mean (abs(result - value) < delta) or (fabs(result - value) < delta)?
I was talking pseudo-code, actually, rather than implying any particular
function from the C library. You are quite correct that it should be
fabs() [float] rather than abs() [integer] in the standard C library.
QNX Training Services
dagibbs@qnx.com