# 0 isn't 0 in C++ math

Show 50 post(s) from this thread on one page
Page 2 of 2 First 12
• October 2nd, 2011, 08:34 AM
VictorN
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
when add one time its true, but when you do it with cycle it looks something like this

a = -0.1 + 0.01000000001 and so on
and then you compare 0 with a it is looks something like this 0 != 0.0000000000001

Haven't you read yet what I referred to in the post#2?
• October 2nd, 2011, 08:45 AM
justutiz
Re: 0 isn't 0 in C++ math
so
Code:

`if ( fabsf(c - a) < 0.000001 )`
is the best and shortest way?
• October 2nd, 2011, 08:49 AM
VictorN
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
so
Code:

`if ( fabsf(c - a) < 0.000001 )`
is the best and shortest way?

I'd say it is the only way. The question is only about this 'delta' value. In some case your choice with 0.000001 can work, in other - not. It all depends on the problem / values you are working on / with.
• October 2nd, 2011, 08:52 AM
justutiz
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by VictorN
I'd say it is the only way. The question is only about this 'delta' value. In some case your choice with 0.000001 can work, in other - not. It all depends on the problem / values you are working on / with.

so it is posible to make working with all values, if az i take 0.000000001 then it is not working, so i need to add more 0.00000000000000001 in compare, it is other way?
• October 2nd, 2011, 08:56 AM
VictorN
Re: 0 isn't 0 in C++ math
Again: did you read about FP arithmetic?
• October 2nd, 2011, 09:37 AM
Paul McKenzie
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
so it is posible to make working with all values, if az i take 0.000000001 then it is not working, so i need to add more 0.00000000000000001 in compare, it is other way?

http://www.parashift.com/c++-faq-lit...html#faq-29.16
http://www.parashift.com/c++-faq-lit...html#faq-29.17
http://www.parashift.com/c++-faq-lit...html#faq-29.18

Computers work in binary, not decimal. This means that the decimal numbers you're trying to use must be converted to binary. Do you know how to convert a decimal floating point value to a binary floating point value? If you do, then you will see why decimal fractions cannot have exact binary representations unless they are a sum of inverse powers of 2.

If you want exact numbers, then don't use float or double. Use a class that represents arbitrary precision numbers, and there are many of them out there.

Regards,

Paul McKenzie
• October 2nd, 2011, 09:41 AM
justutiz
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by VictorN
Again: did you read about FP arithmetic?

Yes, but dont understand everything. I just need to do a program in few days. This is my first program and I am still learning everything.
• October 2nd, 2011, 09:47 AM
Paul McKenzie
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
Yes, but dont understand everything. I just need to do a program in few days. This is my first program and I am still learning everything.

Well, this code will not work:
Code:

`for (float a = ap; a <= ag; a += az)`
Never use floats or doubles as loop counters. Never.

The reason is that you cannot guarantee how many times that loop will execute. It could execute 1 more time than expected, and the reason was explained by everyone so far -- floating point computations are not exact.

Always use integers as loop counters. This guarantees that the loop will execute the exact number of times you expect. For example, if you know you should loop from 0.01 to 0.1 then you write this:
Code:

```for (int i = 1; i <= 100; ++i) {     double myValue = i / 100.0;     // then you use myValue in the loop, not i     //... }```
Now the loop is guaranteed to loop 100 times. The bottom line is however you do it, the goal is to normalize all "counted" loops to use integers as loop counters.

Regards,

Paul McKenzie
Show 50 post(s) from this thread on one page
Page 2 of 2 First 12