Why Does Multiplying Floats in C Lead to Unexpected Results?

  • Thread starter Thread starter meldave00
  • Start date Start date
  • Tags Tags
    Program
AI Thread Summary
The discussion centers on issues related to floating-point arithmetic in C programming, specifically the inaccuracies that arise when multiplying float values. The original poster experiences unexpected results, such as 4.42 multiplied by 10.00 yielding 44.200001, due to the limitations of the float data type, which can only represent a finite number of values. The conversation highlights that floats, which use four bytes of memory, cannot accurately represent all decimal numbers, leading to rounding errors. A common solution suggested is to use the double data type, which offers greater precision. Additionally, it is noted that floating-point numbers are inherently approximate due to their discrete nature, and programmers should be aware of these limitations to avoid pitfalls in calculations. The importance of understanding the underlying principles of floating-point representation is emphasized to mitigate issues in scientific programming.
meldave00
Messages
39
Reaction score
0
Hi,

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: ");
scanf("%f",&aFloat1);

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

aFloat3 = aFloat2 * aFloat1;

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

getchar();
getchar();

};


regards,

meldave00
 
Technology news on Phys.org
go to double (precision)
 
meldave00 said:
Why does this do this?
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.
meldave00 said:
printf(" The value of aFloat3 is: $%f \n\n", aFloat3);

Try this instead.
printf(" The value of aFloat3 is: $%8.4f \n\n", aFloat3);
 
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.
 
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.
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...
Back
Top