468,117 Members | 2,060 Online

# Problem in Float Arithmetic

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

Jun 27 '08 #1
5 2354 On Mon, 23 Jun 2008 04:51:40 -0700, Selvam wrote:
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++
See this FAQ:

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

Regards,

--
Lionel B
Jun 27 '08 #2
Selvam <ka***********@gmail.comwrites:
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/co...berg1.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).

--
__Pascal Bourguignon__
Jun 27 '08 #3
On Mon, 23 Jun 2008 14:15:22 +0200, Pascal J. Bourguignon wrote:
Selvam <ka***********@gmail.comwrites:
>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.
>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).
You've changed the application domain? You must be psychic. Personally
I've no idea what the OP's application domain might be.

--
Lionel B
Jun 27 '08 #4
Selvam wrote:
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.
Jun 27 '08 #5
On Jun 23, 1:51 pm, Selvam <kalaiselva...@gmail.comwrote:
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.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jun 27 '08 #6

### This discussion thread is closed

Replies have been disabled for this discussion.

### Similar topics

 6 posts views Thread by asmirnov1234567890 | last post: by 3 posts views Thread by David Sharp | last post: by 5 posts views Thread by Yodai | last post: by 54 posts views Thread by Andy | last post: by 18 posts views Thread by Manohar S | last post: by 1 post views Thread by Shreyas Kulkarni | last post: by 60 posts views Thread by Erick-> | last post: by 27 posts views Thread by galt_57 | last post: by 116 posts views Thread by Dilip | last post: by 5 posts views Thread by SwissProgrammer | last post: by 1 post views Thread by sipeed | last post: by reply views Thread by MarkWatson381 | last post: by 2 posts views Thread by RaGa68 | last post: by 4 posts views Thread by mshakeelattari | last post: by reply views Thread by ravipankaj | last post: by reply views Thread by krisrajz | last post: by 10 posts views Thread by didacticone | last post: by reply views Thread by ravipankaj | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.