Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Need help with simple C program

  1. May 2, 2007 #1

    Please see my code below. If I enter 4.42 in for my first float
    and 10.00 in for my second float and I muliply them together I get
    a result of 44.200001. The reason is because the compiler thinks
    that 4.42 = 4.4200001 (I checked this during debug). Why does this
    do this? How does anybody get accurate results when working with
    C? Anyone know what the work around is for this type of issue?
    I'm refreshing my knowledge of C.... I'm a little rusty.

    #include <stdio.h>

    void main(){

    float aFloat1; float aFloat2; float aFloat3;

    printf(" Please enter the value of float #1: ");

    printf(" Please enter the value of float #2: ");
    scanf("%f", &aFloat2);

    aFloat3 = aFloat2 * aFloat1;

    printf(" The value of aFloat3 is: $%f \n\n", aFloat3);




  2. jcsd
  3. May 2, 2007 #2
    go to double (precision)
  4. May 2, 2007 #3
    A float takes up four bytes of memory and therefor can only represent at most 4 billion or so different numbers out of the infinitely many numbers there are. As a result, not all numbers are perfectly represented. By using double instead of float, you greatly increase the ability to represent, but still nowhere near infinite.
    Try this instead.
    printf(" The value of aFloat3 is: $%8.4f \n\n", aFloat3);
  5. May 2, 2007 #4


    User Avatar
    Science Advisor
    Homework Helper

    Float is and always has been problematical in this regard.
    In the OP the problem can be fixed by truncation.
    But, 1+1 = 1.999999 is not going to get fixed this way.
  6. May 2, 2007 #5
    This has nothing to do with C. It's a property of the machine and how it represents numbers.

    See http://docs.sun.com/source/806-3568/ncg_goldberg.html

    Floating point numbers are not continuous--they're discrete. There are a lot of numbers (I would guess most of them) that cannot be represented exactly by a finite number of digits. In base 10, think square root of two, or 1/3. In the usual binary floating point representation, I believe 1/10 cannot be represented in a finite sequence of digits.

    So remember, your results are almost always approximate. It may not even be that good an approximation, and there are ways to blow away your approximation in a hurry. If you keep that in mind, you'll be ahead of most scientific programmers. "Go to double" is the standard answer. But if you don't understand the underlying problem, you'll get bit there, too.
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook