Problem in Float Arithmetic

S

Selvam

Hi All,

I am getting exponent value when doing float arithmetic in C++.
Instead of that I need accurate value.

float amount = 0.0f;
float x = 0.99999976f;
amount= 1.0f - x;

I am getting amount as 2.3841858e-007 instead of 0.00000024
Can anyone tell what will
be the solution for this problem???

Note : I am getting correct value in C#.Net but not in C++

Thanks in advance.

Regards,
K
 
P

Pascal J. Bourguignon

Selvam said:
Hi All,

I am getting exponent value when doing float arithmetic in C++.
Instead of that I need accurate value.

float amount = 0.0f;
float x = 0.99999976f;
amount= 1.0f - x;

I am getting amount as 2.3841858e-007 instead of 0.00000024

Have a look at:
"What Every Computer Scientist Should Know About Floating-Point Arithmetic"
http://focus.hut.fi/docs/WorkShop/common/ug/goldberg1.doc.html
http://docs-pdf.sun.com/800-7895/800-7895.pdf
http://portal.acm.org/citation.cfm?id=103163
Can anyone tell what will
be the solution for this problem???

The bug you made is here: float amount;
^^^^^ ^^^^^^

Amounts ARE NOT floating point numbers. You should NEVER use
float(-ing point) numbers in financial applications.

If you want exact arithmetic, use integers (and rationals or
fixed-point numbers). http://gmplib.org/

Note : I am getting correct value in C#.Net but not in C++

Only because C#{float} == C++{double}.
Try:

float weight = 0.0f;
float x = 0.999999999999999976f;
weight= 1.0f - x;

in C#. (Notice how I changed the application domain, from amounts to
weight, to make it a correct program).
 
L

Lionel B

Selvam said:
Hi All,

I am getting exponent value when doing float arithmetic in C++. Instead
of that I need accurate value.

float amount = 0.0f;
float x = 0.99999976f;
amount= 1.0f - x;

I am getting amount as 2.3841858e-007 instead of 0.00000024
[...]

The bug you made is here: float amount;
^^^^^ ^^^^^^

Amounts ARE NOT floating point numbers. You should NEVER use float(-ing
point) numbers in financial applications.

Where did the OP say "financial application"? There are amounts of other
stuff besides money, surely ;-)

Aside from which, I'm not convinced that's realistic advice (I once
programmed for a financial institution where we worked quite happily in
floating point - paying very careful attention to precision and rounding,
of course).
If you want exact arithmetic, use integers (and rationals or fixed-point
numbers). http://gmplib.org/

Maybe - but seeing as we don't know what the problem domain of the OP is,
this may not be the way to go.
Only because C#{float} == C++{double}. Try:

float weight = 0.0f;
float x = 0.999999999999999976f;
weight= 1.0f - x;

in C#. (Notice how I changed the application domain, from amounts to
weight, to make it a correct program).

You've changed the application domain? You must be psychic. Personally
I've no idea what the OP's application domain might be.
 
J

Juha Nieminen

Selvam said:
Instead of that I need accurate value.

Then don't use floating point numbers.
float amount = 0.0f;
float x = 0.99999976f;
amount= 1.0f - x;

I am getting amount as 2.3841858e-007 instead of 0.00000024

Using 'double' instead of 'float' may decrease the rounding errors,
but probably won't remove them.
 
J

James Kanze

I am getting exponent value when doing float arithmetic in
C++. Instead of that I need accurate value.

I'm not sure what you mean by "accurate value". You're
probablyl getting a reasonably accurate value in the results,
but just not formatting it correctly.
float amount = 0.0f;
float x = 0.99999976f;
amount= 1.0f - x;
I am getting amount as 2.3841858e-007 instead of 0.00000024

Which is probably more accurate. (Note that despite what you
wrote, you certainly never had a float value of 0.99999976.) Of
course, if what you want is the value rounded to 8 points after
the decimal, then you have to tell the computer to output it
like that:
std::cout.setf( std::ios::fixed, std::ios::floatfield ) ;
std::cout.precision( 8 ) ;
std::cout << x ;
Typically, of course, you'll wrap those first two statements in
some sort of application specific manipulator, and write
something like:

std::cout << appliFmt << x ;

(Also: float is only good for six or seven decimal digits
accuracy; you probably want to consider double.)
Can anyone tell what will be the solution for this problem???
Note : I am getting correct value in C#.Net but not in C++

I'm pretty sure that you're getting the same results in both
cases. But the default formatting isn't necessarily the same.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top