Velocity Reviews > C++ > Problem in Float Arithmetic

# Problem in Float Arithmetic

Selvam
Guest
Posts: n/a

 06-23-2008
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++

Regards,
K

Lionel B
Guest
Posts: n/a

 06-23-2008
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

Pascal J. Bourguignon
Guest
Posts: n/a

 06-23-2008
Selvam <(E-Mail Removed)> writes:

> 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__

Lionel B
Guest
Posts: n/a

 06-23-2008
On Mon, 23 Jun 2008 14:15:22 +0200, Pascal J. Bourguignon wrote:

> Selvam <(E-Mail Removed)> writes:
>
>> 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

Juha Nieminen
Guest
Posts: n/a

 06-23-2008
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.

James Kanze
Guest
Posts: n/a

 06-23-2008
On Jun 23, 1:51 pm, Selvam <(E-Mail Removed)> wrote:

> 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:(E-Mail Removed)
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