Problem in Float Arithmetic

Discussion in 'C++' started by Selvam, Jun 23, 2008.

  1. Selvam

    Selvam Guest

    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
     
    Selvam, Jun 23, 2008
    #1
    1. Advertising

  2. Selvam

    Lionel B Guest

    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-lite/newbie.html#faq-29.16

    Regards,

    --
    Lionel B
     
    Lionel B, Jun 23, 2008
    #2
    1. Advertising

  3. Selvam <> 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/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).

    --
    __Pascal Bourguignon__
     
    Pascal J. Bourguignon, Jun 23, 2008
    #3
  4. Selvam

    Lionel B Guest

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

    > Selvam <> 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
     
    Lionel B, Jun 23, 2008
    #4
  5. 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.
     
    Juha Nieminen, Jun 23, 2008
    #5
  6. Selvam

    James Kanze Guest

    On Jun 23, 1:51 pm, Selvam <> 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:
    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
     
    James Kanze, Jun 23, 2008
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. bd
    Replies:
    0
    Views:
    651
  2. joshc
    Replies:
    5
    Views:
    575
    Keith Thompson
    Mar 31, 2005
  3. Carsten Fuchs
    Replies:
    45
    Views:
    1,607
    James Kanze
    Oct 8, 2009
  4. Sean

    float point arithmetic a-a != 0.0

    Sean, Mar 8, 2010, in forum: C Programming
    Replies:
    12
    Views:
    519
    Ben Bacarisse
    Mar 9, 2010
  5. MaggotChild
    Replies:
    6
    Views:
    146
    MaggotChild
    Dec 2, 2009
Loading...

Share This Page